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


912

Данный:

a = 1
b = 10
c = 100

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

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

01
10
100

Ответы:


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

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

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

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)

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

Вы можете сделать это с помощью 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.