Afficher le numéro avec des zéros en tête


912

Donné:

a = 1
b = 10
c = 100

Comment afficher un zéro non significatif pour tous les nombres de moins de deux chiffres?

Voici la sortie que j'attends:

01
10
100

Réponses:


1061

Dans Python 2 (et Python 3), vous pouvez faire:

print "%02d" % (1,)

Fondamentalement, % est comme printfou sprintf(voir la documentation ).


Pour Python 3. +, le même comportement peut également être obtenu avec format:

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

Pour Python 3.6+, le même comportement peut être obtenu avec des chaînes f :

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

8
Exemple: imprimer "% 05d"% result ['postalCode'] pour un code postal à 5 ​​chiffres.
Nick Woodhams

2
x = "%02d.txt" % idéclenche TypeError (ne peut pas concaténer les objets 'str' et 'int'), mais x = "%02d.txt" % (i,)ne le fait pas. Intéressant. Je me demande où est documenté
thêta

@theta En 2.7.6, je n'ai pas d'erreur. Peut-être que c'était un bug dans une version spécifique de Python qu'ils ont corrigé depuis?
Jack M.

1
Peut être. En 2.7.6, il n'y a pas d'exception si la valeur de format n'est pas tuple (au moins pour cet exemple). En regardant la date de mon commentaire, je suppose que j'utilisais 2.7.3 à l'époque, et à ce moment-là, je ne savais pas que mettre une seule variable dans un tuple vous mettait en sécurité lorsque vous utilisez %le formateur de chaînes.
thêta

1
Pour élaborer, les documents expliquent ceci ici: "Quand aucun alignement explicite n'est donné, le fait de précéder le champ largeur par un caractère zéro ('0') permet un remplissage à zéro sensible aux signes pour les types numériques. Cela équivaut à un caractère de remplissage de ' 0 'avec un type d'alignement' = '. "
JHS

940

Vous pouvez utiliser str.zfill:

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

impressions:

01
10
100

71
J'aime cette solution, car elle aide non seulement lors de la sortie du nombre, mais lorsque vous devez l'attribuer à une variable ... par exemple x = str (datetime.date.today (). Month) .zfill (2) retournera x comme '02' pour le mois de février.
EroSan

2
Cela devrait être la bonne réponse, car le "{1:02d}"ne peut pas avoir de variables à la place de 2(comme si vous créez une fonction dynamique).
Joshua Varghese

363

Dans Python 2.6+ et 3.0+, vous utiliseriez la format()méthode de chaîne:

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

ou en utilisant le intégré (pour un seul numéro):

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

Voir la documentation du PEP-3101 pour les nouvelles fonctions de formatage.


29
Fonctionne également en Python 2.7.5. Vous pouvez également utiliser '{: 02d}'. Format (1) si vous ne souhaitez pas utiliser d'arguments nommés.
Jason Martens

1
Fonctionne très bien en 2.7.2, avec un virgule flottante "{0: 04.0f}". Le format (1.1) donne 0001 (: 04 = au moins 4 caractères, dans ce cas en commençant par 0, .0f = virgule flottante sans décimales) . Je connais le formatage% mais je voulais modifier une instruction .format existante sans réécrire le tout . Merci!
Michael Stimson

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

impressions:

01
10
100

1
De cette façon, vous pouvez répéter l'argument plusieurs fois dans la chaîne:One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)
srodriguex

2
Compatible uniquement avec Python 3. Si vous utilisez Python 2.7, faitesprint '{:02}'.format(1)
Blairg23


73

En Python> = 3.6 , vous pouvez le faire succinctement avec les nouvelles chaînes f qui ont été introduites en utilisant:

f'{val:02}'

qui imprime la variable avec un nom valavec une fillvaleur de 0et un widthde2 .

Pour votre exemple spécifique, vous pouvez le faire en boucle:

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

qui imprime:

01 
10
100

Pour plus d'informations sur les chaînes f, jetez un œil au PEP 498 où elles ont été introduites.


56
x = [1, 10, 100]
for i in x:
    print '%02d' % i

résulte en:

01
10
100

Lisez plus d'informations sur le formatage des chaînes à l'aide de% dans la documentation.


9
L'exemple de documentation est nul. Ils jettent la cartographie avec le premier échantillon zéro, il est donc difficile de savoir lequel est, à moins que vous ne sachiez déjà comment cela fonctionne. C'est ce qui m'a amené ici, en fait.
Grant

49

La façon Pythonique de le faire:

str(number).rjust(string_width, fill_char)

De cette façon, la chaîne d'origine est retournée inchangée si sa longueur est supérieure à string_width. Exemple:

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

Résultats:

01
10
100

33

Ou une autre solution.

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

3
Ce serait la manière Python, bien "{0:0>2}".format(number)que j'inclue le paramètre pour plus de clarté - , si quelqu'un veut nLeadingZeros, il doit noter qu'il peut également le faire:"{0:0>{1}}".format(number, nLeadingZeros + 1)
Jonathan Allan


4

Voici comment je le fais:

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

Fondamentalement, zfill prend le nombre de zéros en tête que vous souhaitez ajouter, il est donc facile de prendre le plus grand nombre, de le transformer en chaîne et d'obtenir la longueur, comme ceci:

Python 3.6.5 (par défaut, 11 mai 2018, 04:00:52) 
[GCC 8.1.0] sur linux
Tapez "aide", "copyright", "crédits" ou "licence" pour plus d'informations.
>>> total = 100
>>> print (str (1) .zfill (len (str (total))))
001
>>> total = 1000
>>> print (str (1) .zfill (len (str (total))))
0001
>>> total = 10000
>>> print (str (1) .zfill (len (str (total))))
00001
>>> 

Cela ne contredit-il pas la réponse de Datageek ?
Peter Mortensen

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

1

Vous pouvez le faire avec des chaînes f .

import numpy as np

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

Cela imprimera une longueur constante de 8 et remplira le reste avec l'interlignage 0.

00000001
00000124
00013566

0

Utilisation:

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

Ou avec le mathmodule:

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


-2

S'il s'agit de nombres à un ou deux chiffres:

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.