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


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.