Question La meilleure façon de remplir les zéros d'une chaîne


Quel est le moyen le plus Python de remplir une chaîne numérique avec des zéros à gauche, c'est-à-dire que la chaîne numérique a une longueur spécifique?


997
2017-12-03 22:39


origine


Réponses:


Cordes:

>>> n = '4'
>>> print n.zfill(3)
004

Et pour les numéros:

>>> n = 4
>>> print '%03d' % n
004
>>> print format(n, '03') # python >= 2.6
004
>>> print '{0:03d}'.format(n)  # python >= 2.6
004
>>> print '{foo:03d}'.format(foo=n)  # python >= 2.6
004
>>> print('{:03d}'.format(n))  # python >= 2.7 + python3
004
>>> print('{0:03d}'.format(n))  # python 3
004
>>> print(f'{n:03}') # python >= 3.6
004

Documentation de mise en forme de chaîne.


1588
2017-12-03 22:42



Utilisez simplement le rjust méthode de l'objet chaîne.

Cet exemple fera une chaîne de 10 caractères, en remplissant si nécessaire.

>>> t = 'test'
>>> t.rjust(10, '0')
>>> '000000test'

274
2017-12-03 22:47



Pour les numéros:

print "%05d" % number

Voir également: Python: formatage de chaîne.

MODIFIER: Il est à noter que dès hier Le 3 décembre 2008, cette méthode de formatage est dépréciée au profit du format méthode de chaîne:

print("{0:05d}".format(number)) # or
print(format(number, "05d"))

Voir PEP 3101 pour plus de détails.


85
2017-12-03 22:41



>>> '99'.zfill(5)
'00099'
>>> '99'.rjust(5,'0')
'00099'

si vous voulez le contraire:

>>> '99'.ljust(5,'0')
'99000'

43
2018-01-10 23:19



Fonctionne à la fois dans Python 2 et Python 3:

>>> "{:0>2}".format("1")  # Works for both numbers and strings.
'01'
>>> "{:02}".format(1)  # Only works for numbers.
'01'

41
2018-06-24 12:31



str(n).zfill(width) travaillera avec strings, ints, floats ... et est Python 2.X et 3.X compatible:

>>> n = 3
>>> str(n).zfill(5)
'00003'
>>> n = '3'
>>> str(n).zfill(5)
'00003'
>>> n = '3.0'
>>> str(n).zfill(5)
'003.0'

32
2018-06-01 04:40



Pour ceux qui sont venus ici pour comprendre et pas seulement une réponse rapide. Je fais cela surtout pour les chaînes de temps:

hour = 4
minute = 3
"{:0>2}:{:0>2}".format(hour,minute)
# prints 04:03

"{:0>3}:{:0>5}".format(hour,minute)
# prints '004:00003'

"{:0<3}:{:0<5}".format(hour,minute)
# prints '400:30000'

"{:$<3}:{:#<5}".format(hour,minute)
# prints '4$$:3####'

"0" symboles quoi remplacer avec les caractères de remplissage "2", la valeur par défaut est un espace vide

Les symboles ">" allignent tout le caractère 2 "0" à gauche de la chaîne

":" symboles le format_spec


15
2017-07-13 13:59



width = 10
x = 5
print "%0*d" % (width, x)
> 0000000005

Voir la documentation d'impression pour tous les détails passionnants!

Mise à jour pour Python 3.x (7.5 ans plus tard)

Cette dernière ligne devrait maintenant être:

print("%0*d" % (width, x))

C'est à dire. print() est maintenant une fonction, pas une déclaration. Notez que je préfère toujours la vieille école printf() style parce que, IMNSHO, ça se lit mieux, et parce que, euh, j'utilise cette notation depuis janvier 1980. Quelque chose ... de vieux chiens ... quelque chose ... de nouveaux trucs.


14
2017-12-03 22:44



>>> width = 4
>>> x = 5
>>> print("%0*d" %(width,x))
>>> 00005

cela fonctionnera dans python 3.x


4
2017-08-01 05:44



Pour les codes postaux enregistrés en tant qu'entiers:

>>> a = 6340
>>> b = 90210
>>> print '%05d' % a
06340
>>> print '%05d' % b
90210

4
2018-06-01 04:27



Comparaison de synchronisation rapide:

setup = '''
from random import randint
def test_1():
    num = randint(0,1000000)
    return str(num).zfill(7)
def test_2():
    num = randint(0,1000000)
    return format(num, '07')
def test_3():
    num = randint(0,1000000)
    return '{0:07d}'.format(num)
def test_4():
    num = randint(0,1000000)
    return format(num, '07d')
def test_5():
    num = randint(0,1000000)
    return '{:07d}'.format(num)
def test_6():
    num = randint(0,1000000)
    return '{x:07d}'.format(x=num)
def test_7():
    num = randint(0,1000000)
    return str(num).rjust(7, '0')
'''
import timeit
print timeit.Timer("test_1()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_2()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_3()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_4()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_5()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_6()", setup=setup).repeat(3, 900000)
print timeit.Timer("test_7()", setup=setup).repeat(3, 900000)


> [2.281613943830961, 2.2719342631547077, 2.261691106209631]
> [2.311480238815406, 2.318420542148333, 2.3552384305184493]
> [2.3824197456864304, 2.3457239951596485, 2.3353268829498646]
> [2.312442972404032, 2.318053102249902, 2.3054072168069872]
> [2.3482314132374853, 2.3403386400002475, 2.330108825844775]
> [2.424549090688892, 2.4346475296851438, 2.429691196530058]
> [2.3259756401716487, 2.333549212826732, 2.32049893822186]

J'ai fait différents tests de différentes répétitions. Les différences ne sont pas énormes, mais dans tous les tests, le zfill la solution était la plus rapide.


3
2018-06-28 10:58