Visualizza il numero con zeri iniziali


912

Dato:

a = 1
b = 10
c = 100

Come posso visualizzare uno zero iniziale per tutti i numeri con meno di due cifre?

Questo è l'output che mi aspetto:

01
10
100

Risposte:


1060

In Python 2 (e Python 3) puoi fare:

print "%02d" % (1,)

Fondamentalmente % è come printfo sprintf(vedi documenti ).


Per Python 3. +, lo stesso comportamento può essere ottenuto anche con format:

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

Per Python 3.6+ è possibile ottenere lo stesso comportamento con le stringhe f :

print(f"{1:02d}")

8
Esempio: stampa "% 05d"% risultato ['PostalCode'] per un codice postale di 5 cifre.
Nick Woodhams,

2
x = "%02d.txt" % igenera TypeError (impossibile concatenare gli oggetti 'str' e 'int'), ma x = "%02d.txt" % (i,)non lo fa. Interessante. Mi chiedo dove sia documentato
theta il

@theta In 2.7.6, non ricevo un errore. Forse questo era un bug in una versione specifica di Python che da allora hanno risolto?
Jack M.

1
Può essere. In 2.7.6 non c'è eccezione se il valore del formato non è tupla (almeno per questo esempio). Guardando la data del mio commento suppongo che stavo correndo 2.7.3 allora, e in quel momento non sapevo che mettere una singola variabile in una tupla ti %mettesse al sicuro mentre usavo il formatore di stringhe.
theta,

1
Per elaborare, i documenti spiegano questo qui: "Quando non viene fornito alcun allineamento esplicito, precedendo il campo di larghezza con un carattere zero ('0') si abilita il riempimento zero con riconoscimento dei segni per i tipi numerici. Ciò equivale a un carattere di riempimento di ' 0 'con un tipo di allineamento di' = '. "
JHS,

940

Puoi usare str.zfill:

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

stampe:

01
10
100

71
Mi piace questa soluzione, poiché aiuta non solo quando si emette il numero, ma quando è necessario assegnarlo a una variabile ... ad esempio x = str (datetime.date.today (). Month) .zfill (2) restituirà x come '02' per il mese di febbraio.
EroSan,

2
Questa dovrebbe essere la risposta corretta, dal momento che "{1:02d}"non possono avere variabili al posto di 2(come se si stesse creando una funzione dinamica).
Joshua Varghese,

363

In Python 2.6+ e 3.0+, useresti il format()metodo string:

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

o usando il built-in (per un singolo numero):

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

Vedere la documentazione PEP-3101 per le nuove funzioni di formattazione.


29
Funziona anche in Python 2.7.5. Puoi anche usare '{: 02d}'. Format (1) se non vuoi usare argomenti con nome.
Jason Martens,

1
Funziona bene in 2.7.2, con un virgola mobile "{0: 04.0f}". Il formato (1.1) fornisce 0001 (: 04 = almeno 4 caratteri, in questo caso porta 0, .0f = virgola mobile senza decimali) . Sono a conoscenza della formattazione% ma volevo modificare un'istruzione .format esistente senza riscrivere il tutto . Grazie!
Michael Stimson,

129
print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

stampe:

01
10
100

1
In questo modo puoi ripetere l'argomento più volte all'interno della stringa:One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)
srodriguex

2
Compatibile solo con Python 3. Se si utilizza Python 2.7, eseguireprint '{:02}'.format(1)
Blairg23

89

O questo:

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


73

In Python> = 3.6 , puoi farlo in modo succinto con le nuove stringhe f che sono state introdotte usando:

f'{val:02}'

che stampa la variabile con nome valcon un fillvalore di 0e un widthdi2 .

Per il tuo esempio specifico puoi farlo bene in un ciclo:

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

che stampa:

01 
10
100

Per ulteriori informazioni sulle f-string, dai un'occhiata a PEP 498 dove sono state introdotte.



49

Il modo Pythonic per farlo:

str(number).rjust(string_width, fill_char)

In questo modo, la stringa originale viene restituita invariata se la sua lunghezza è maggiore di string_width. Esempio:

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

risultati:

01
10
100

33

O un'altra soluzione.

"{:0>2}".format(number)

3
Questo sarebbe il modo di Python, anche se includerei il parametro per chiarezza - "{0:0>2}".format(number), se qualcuno vuole nLeadingZeros dovrebbero notare che possono anche fare:"{0:0>{1}}".format(number, nLeadingZeros + 1)
Jonathan Allan


4

Ecco come lo faccio:

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

Fondamentalmente zfill prende il numero di zeri iniziali che si desidera aggiungere, quindi è facile prendere il numero più grande, trasformarlo in una stringa e ottenere la lunghezza, in questo modo:

Python 3.6.5 (impostazione predefinita, 11 maggio 2018, 04:00:52) 
[GCC 8.1.0] su Linux
Digita "aiuto", "copyright", "crediti" o "licenza" per ulteriori informazioni.
>>> totale = 100
>>> print (str (1) .zfill (len (str (total))))
001
>>> totale = 1000
>>> print (str (1) .zfill (len (str (total))))
0001
>>> totale = 10000
>>> print (str (1) .zfill (len (str (total))))
00001
>>> 

Ciò non contraddice la risposta di Datageek ?
Peter Mortensen,

1
width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted

1

Puoi farlo con le stringhe f .

import numpy as np

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

Questo stamperà una lunghezza costante di 8 e riempirà il resto con il comando 0.

00000001
00000124
00013566

0

Uso:

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

O con il mathmodulo:

import math
'00'[math.ceil(math.log(i, 10)):] + str(i)


-2

Se hai a che fare con numeri composti da una o due cifre:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.