Показать номер с ведущими нулями

912

Данный:

a = 1
b = 10
c = 100

Как отобразить начальный ноль для всех чисел, состоящих менее чем из двух цифр?

Это результат, который я ожидаю:

01
10
100
ashchristopher
источник

Ответы:

1062

В 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»% result ['postalCode'] для 5-значного почтового индекса.
Ник Вудхэмс
2
x = "%02d.txt" % iвызывает TypeError (не может объединять объекты 'str' и 'int'), но x = "%02d.txt" % (i,)не делает. Интересно. Интересно, где это задокументировано
тета
@theta В 2.7.6 я не получаю ошибку. Может быть, это была ошибка в конкретной версии Python, которую они с тех пор исправили?
Джек М.
1
Может быть. В 2.7.6 нет исключения, если значение формата не является кортежем (по крайней мере, для этого примера). Глядя на дату моего комментария, я думаю, что тогда я запускал 2.7.3, и в то время я не знал, что помещение одной переменной в кортеж поможет вам в безопасности при использовании %строкового форматера.
Тета
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
Datageek
источник
71
Мне нравится это решение, так как оно помогает не только при выводе числа, но и когда вам нужно присвоить его переменной ... например, x = str (datetime.date.today (). Month) .zfill (2) вернется х как '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}'. Format (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
Kresimir
источник
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

Прочитайте больше информации о форматировании строки, используя% в документации.

nosklo
источник
9
Пример документации отстой. Они добавляют сопоставление с ведущей нулевой выборкой, поэтому трудно понять, что есть что, если вы уже не знаете, как это работает. Это то, что привело меня сюда, на самом деле.
Грант
49

Pythonic способ сделать это:

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)
WinterChilly
источник
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
>>> print (str (1) .zfill (len (str (всего))))
001
>>> всего = 1000
>>> print (str (1) .zfill (len (str (всего))))
0001
>>> итого = 10000
>>> print (str (1) .zfill (len (str (всего))))
00001
>>> 
Роберто
источник
Разве это не противоречит ответу Datageek ?
Питер Мортенсен
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)
Linekio
источник
-2

Если речь идет о числах, состоящих из одной или двух цифр:

'0'+str(number)[-2:] или '0{0}'.format(number)[-2:]

Knowbody
источник