Wyświetl liczbę z wiodącymi zerami

910

Dany:

a = 1
b = 10
c = 100

Jak wyświetlić zero na początku dla wszystkich liczb zawierających mniej niż dwie cyfry?

Oto wynik, którego oczekuję:

01
10
100
Ashchristopher
źródło

Odpowiedzi:

1059

W Python 2 (i Python 3) możesz:

print "%02d" % (1,)

Zasadniczo % jest jak printflub sprintf(patrz dokumenty ).


W przypadku Python 3.+ to samo zachowanie można również osiągnąć za pomocą format:

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

W Pythonie 3.6+ to samo zachowanie można osiągnąć za pomocą f-stringów :

print(f"{1:02d}")
Jack M.
źródło
8
Przykład: wydrukuj „% 05d”% wynik ['kod pocztowy'] dla 5-cyfrowego kodu pocztowego.
Nick Woodhams
2
x = "%02d.txt" % ipodnosi TypeError (nie może łączyć obiektów „str” i „int”), ale x = "%02d.txt" % (i,)nie robi tego. Ciekawy. Zastanawiam się, gdzie to jest udokumentowane
theta
@theta W wersji 2.7.6 nie pojawia się błąd. Może to był błąd w konkretnej wersji Pythona, którą naprawili?
Jack M.
1
Może. W 2.7.6 nie ma wyjątku, jeśli wartość formatu nie jest krotką (przynajmniej w tym przykładzie). Patrząc na datę mojego komentarza, myślę, że wtedy działałem w wersji 2.7.3, i wtedy nie wiedziałem, że umieszczenie jednej zmiennej w krotce zapewnia bezpieczeństwo podczas korzystania z %formatera łańcuchowego.
theta
1
Aby to wyjaśnić, doktorzy wyjaśniają to tutaj: „Gdy nie podano wyraźnego wyrównania, poprzedzenie pola szerokości znakiem zero („ 0 ”) umożliwia znakowanie zerami dla znaków numerycznych. Jest to równoważne znakowi wypełnienia„ 0 'z typem wyrównania „=”. ”
JHS
940

Możesz użyć str.zfill:

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

drukuje:

01
10
100
Datageek
źródło
71
Podoba mi się to rozwiązanie, ponieważ pomaga nie tylko przy wyprowadzaniu liczby, ale także wtedy, gdy trzeba przypisać ją do zmiennej ... np. X = str (datetime.date.today (). Month) .zfill (2) zwróci x jako „02” dla miesiąca lutego.
EroSan
2
To powinna być poprawna odpowiedź, ponieważ "{1:02d}"nie mogą mieć zmiennych w miejsce 2(np. Jeśli tworzysz funkcję dynamiczną).
Joshua Varghese
363

W Python 2.6+ i 3.0+ użyłbyś format()metody łańcuchowej:

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

lub używając wbudowanego (dla jednego numeru):

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

Zobacz nowe funkcje formatowania w dokumentacji PEP-3101 .

Ber
źródło
29
Działa również w Python 2.7.5. Możesz także użyć „{: 02d}” .format (1), jeśli nie chcesz używać nazwanych argumentów.
Jason Martens
1
Działa dobrze w 2.7.2, z liczbą zmiennoprzecinkową „{0: 04.0f}”. Format (1.1) daje 0001 (: 04 = co najmniej 4 znaki, w tym przypadku wiodące 0, .0f = zmiennoprzecinkowa bez miejsc dziesiętnych) . Jestem świadomy formatowania%, ale chciałem zmodyfikować istniejącą instrukcję .format bez przepisywania całości . Dzięki!
Michael Stimson
129
print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

drukuje:

01
10
100
Kresimir
źródło
1
W ten sposób możesz powtórzyć argument kilka razy w ciągu:One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)
srodriguex
2
print '{:02}'.format(1)
Zgodny
89

Albo to:

print '{0:02d}'.format(1)

ajd
źródło
73

W Pythonie> = 3.6 możesz to zrobić zwięźle z nowymi ciągami f, które zostały wprowadzone przy użyciu:

f'{val:02}'

który drukuje zmiennej o nazwie valo fillwartości 0oraz widthz 2.

W twoim konkretnym przykładzie możesz to zrobić ładnie w pętli:

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

który drukuje:

01 
10
100

Aby uzyskać więcej informacji na temat f-stringów, zobacz PEP 498, w którym zostały wprowadzone.

Dimitris Fasarakis Hilliard
źródło
56
x = [1, 10, 100]
for i in x:
    print '%02d' % i

prowadzi do:

01
10
100

Przeczytaj więcej informacji na temat formatowania łańcucha przy użyciu% w dokumentacji.

nosklo
źródło
9
Przykład dokumentacji jest do kitu. Wrzucają mapowanie z wiodącą próbką zerową, więc trudno jest ustalić, która jest, chyba że już wiesz, jak to działa. Właśnie to mnie tu sprowadziło.
Grant
49

Pythoniczny sposób na zrobienie tego:

str(number).rjust(string_width, fill_char)

W ten sposób oryginalny ciąg znaków jest zwracany bez zmian, jeśli jego długość jest większa niż szerokość_łańcucha. Przykład:

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

Wyniki:

01
10
100
Zulus
źródło
33

Lub inne rozwiązanie.

"{:0>2}".format(number)
WinterChilly
źródło
3
Byłby to sposób Pythona, chociaż "{0:0>2}".format(number)dodałbym parametr dla jasności - jeśli ktoś będzie chciał nLeadingZeros, powinien zauważyć, że może także:"{0:0>{1}}".format(number, nLeadingZeros + 1)
Jonathan Allan
4

Tak to robię:

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

Zasadniczo Zfill przyjmuje liczbę wiodących zer, które chcesz dodać, więc łatwo jest wziąć największą liczbę, przekształcić ją w ciąg i uzyskać długość, jak poniżej:

Python 3.6.5 (domyślnie, 11 maja 2018, 04:00:52) 
[GCC 8.1.0] w systemie Linux
Aby uzyskać więcej informacji, wpisz „pomoc”, „prawa autorskie”, „kredyty” lub „licencja”.
>>> ogółem = 100
>>> print (str (1) .zfill (len (str (total))))
001
>>> ogółem = 1000
>>> print (str (1) .zfill (len (str (total))))
0001
>>> ogółem = 10000
>>> print (str (1) .zfill (len (str (total))))
00001
>>> 
Roberto
źródło
Czy nie jest to sprzeczne z odpowiedzią Datageek ?
Peter Mortensen
1
width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted
nvd
źródło
1

Można to zrobić z f strun .

import numpy as np

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

Spowoduje to wydrukowanie stałej długości 8, a resztę będzie uzupełniać prowadzeniem 0.

00000001
00000124
00013566
Nicolas Gervais
źródło
0

Posługiwać się:

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

Lub z mathmodułem:

import math
'00'[math.ceil(math.log(i, 10)):] + str(i)
Linekio
źródło
-2

W przypadku liczb składających się z jednej lub dwóch cyfr:

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

Knowbody
źródło