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


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.