Відображати номер із провідними нулями


910

Подано:

a = 1
b = 10
c = 100

Як відобразити провідний нуль для всіх чисел із меншими двома цифрами?

Я очікую цього результату:

01
10
100

Відповіді:


1059

У Python 2 (і Python 3) ви можете:

print "%02d" % (1,)

В основному % схоже на ( printfабо sprintfдив. Документи ).


Для Python 3. + така ж поведінка може бути досягнута і з format:

print("{:02d}".format(1))

Для Python 3.6+ та ж поведінка може бути досягнута з f-рядками :

print(f"{1:02d}")

8
Приклад: надрукувати "% 05d"% результат ["PostalCode"] для 5-значний поштовий індекс.
Нік Вудгемс

2
x = "%02d.txt" % iпідвищує TypeError (не може об'єднати об'єкти 'str' та 'int'), але x = "%02d.txt" % (i,)це не робить. Цікаво. Цікаво, де це задокументовано
theta

@theta У 2.7.6 я не отримую помилки. Може, це була помилка в певній версії Python, яку вони з тих пір виправили?
Джек М.

1
Можливо. У 2.7.6 не є винятком, якщо значення формату не змінюється (принаймні для цього прикладу). Дивлячись на дату мого коментаря, я здогадуюсь, що тоді я працював 2.7.3, і тоді я не знав, що введення однієї змінної в кортеж приводить вас у безпечну сторону при використанні %форматів рядків.
theta

1
Для того, щоб пояснити, документи пояснюють це тут: "Коли не вказано явного вирівнювання, перед полем ширини нульовим символом (" 0 ") можна ввести знаки нульового прокладки для числових типів. Це еквівалентно символу заповнення" 0 'з типом вирівнювання' = '. "
JHS

940

Ви можете використовувати str.zfill:

print(str(1).zfill(2))
print(str(10).zfill(2))
print(str(100).zfill(2))

відбитки:

01
10
100

71
Мені подобається це рішення, оскільки воно допомагає не тільки при виведенні числа, але і коли вам потрібно призначити його змінній ... наприклад, x = str (datetime.date.today (). Month) .zfill (2) повернеться x як "02" для місяця феб.
EroSan

2
Це має бути правильна відповідь, оскільки "{1:02d}"не може бути змінних замість 2(наприклад, якщо ви створюєте динамічну функцію).
Джошуа Варгезе

363

У Python 2.6+ та 3.0+ ви використовуєте format()рядовий метод:

for i in (1, 10, 100):
    print('{num:02d}'.format(num=i))

або за допомогою вбудованого (для одного номера):

print(format(i, '02d'))

Дивіться документацію PEP-3101 щодо нових функцій форматування.


29
Працює і в Python 2.7.5. Ви також можете використовувати формат "{: 02d}". (1), якщо ви не хочете використовувати названі аргументи.
Джейсон Мартенс

1
Добре працює в 2.7.2, з плаваючою точкою "{0: 04.0f}". Формат (1.1) дає 0001 (: 04 = принаймні 4 символи, в цьому випадку ведучі 0, .0f = плаваюча точка без десяткових знаків) . Я знаю форматування%, але хотів змінити існуючий оператор .format, не переписуючи все це. Дякую!
Майкл Стімсон

129
print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

відбитки:

01
10
100

1
Таким чином, ви можете повторити аргумент кілька разів у рядку:One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)
srodriguex

2
Сумісний лише з Python 3. Якщо ви використовуєте Python 2.7, зробітьprint '{:02}'.format(1)
Blairg23


73

У Python> = 3.6 ви можете це зробити коротко за допомогою нових f-рядків, які були введені за допомогою:

f'{val:02}'

який друкує змінну з ім'ям valз fillвеличиною 0і а widthз2 .

Для вашого конкретного прикладу ви можете це зробити красиво в циклі:

a, b, c = 1, 10, 100
for val in [a, b, c]:
    print(f'{val:02}')

який друкує:

01 
10
100

Для отримання додаткової інформації про f-рядки, подивіться на PEP 498, де вони були представлені.


56
x = [1, 10, 100]
for i in x:
    print '%02d' % i

призводить до:

01
10
100

Докладніше про формат рядків читайте за допомогою% у документації.


9
Приклад документації відстійний. Вони накидають відображення за допомогою прого нульового зразка, тому важко зрозуміти, що це, якщо ви вже не знаєте, як воно працює. Ось що нас справді привело сюди.
Грант

49

Пітонічний спосіб зробити це:

str(number).rjust(string_width, fill_char)

Таким чином, вихідний рядок повертається незмінним, якщо його довжина перевищує ширину string_width. Приклад:

a = [1, 10, 100]
for num in a:
    print str(num).rjust(2, '0')

Результати:

01
10
100

33

Або інше рішення.

"{:0>2}".format(number)

3
Це був би спосіб Python, хоча я б включив параметр для ясності - "{0:0>2}".format(number)якщо хтось захоче nLeadingZeros, він повинен зазначити, що вони також можуть це зробити:"{0:0>{1}}".format(number, nLeadingZeros + 1)
Джонатан Аллан


4

Ось як я це роблю:

str(1).zfill(len(str(total)))

В основному zfill приймає кількість провідних нулів, які ви хочете додати, тому легко взяти найбільше число, перетворити його в рядок і отримати довжину, як це:

Python 3.6.5 (за замовчуванням, 11 травня 2018, 04:00:52) 
[GCC 8.1.0] на Linux
Введіть "довідка", "авторське право", "кредити" або "ліцензія" для отримання додаткової інформації.
>>> всього = 100
>>> друк (str (1) .zfill (len (str (всього))))
001
>>> всього = 1000
>>> друк (str (1) .zfill (len (str (всього))))
0001
>>> всього = 10000
>>> друк (str (1) .zfill (len (str (всього))))
00001
>>> 


1
width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted

1

Це можна зробити за допомогою f рядків .

import numpy as np

print(f'{np.random.choice([1, 124, 13566]):0>8}')

Це надрукує постійну довжину 8, а решту прокладіть провідними 0.

00000001
00000124
00013566

0

Використання:

'00'[len(str(i)):] + str(i)

Або з mathмодулем:

import math
'00'[math.ceil(math.log(i, 10)):] + str(i)


-2

Якщо ви маєте справу з числами, які мають одну або дві цифри:

'0'+str(number)[-2:] або '0{0}'.format(number)[-2:]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.