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
ashchristopher
la source

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}")
Jack M.
la source
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
Datageek
la source
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.

Ber
la source
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
Kresimir
la source
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
89

Ou ca:

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

ajd
la source
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.

Dimitris Fasarakis Hilliard
la source
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.

nosklo
la source
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
Zoulou
la source
33

Ou une autre solution.

"{:0>2}".format(number)
WinterChilly
la source
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
>>> 
Roberto
la source
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
nvd
la source
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
Nicolas Gervais
la source
0

Utilisation:

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

Ou avec le mathmodule:

import math
'00'[math.ceil(math.log(i, 10)):] + str(i)
Linekio
la source
-2

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

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

Knowbody
la source