web-dev-qa-db-fra.com

Le meilleur moyen de formater un entier en tant que chaîne avec des zéros non significatifs?

J'ai besoin d'ajouter des zéros à l'entier pour créer une chaîne avec un nombre défini de chiffres ($ cnt). Quel est le meilleur moyen de traduire cette fonction simple de PHP en Python:

function add_nulls($int, $cnt=2) {
    $int = intval($int);
    for($i=0; $i<($cnt-strlen($int)); $i++)
        $nulls .= '0';
    return $nulls.$int;
}

Y at-il une fonction qui peut faire cela?

260
ramusus

Vous pouvez utiliser la méthode zfill() pour compléter une chaîne avec des zéros:

In [3]: str(1).zfill(2)
Out[3]: '01'
543
unbeknown

La méthode standard consiste à utiliser des modificateurs de format de chaîne. Ces méthodes de chaîne de format sont disponibles dans la plupart des langages de programmation (via la fonction sprintf dans c par exemple) et constituent un outil pratique à connaître.

i = random.randint(0,99999)
print "%05d" % i

qui produira une chaîne de longueur 5.


Edit: En Python2.6 et supérieur, il y a aussi:

print '{0:05d}'.format(i)

Voir: https://docs.python.org/2/library/string.html

150
user518450

Vous avez probablement besoin de formater votre entier:

'%0*d' % (fill, your_int)

Par exemple,

>>> '%0*d' % (3, 4)
'004'
66
SilentGhost

Python 3.6 f-strings nous permet d'ajouter facilement des zéros non significatifs:

number = 5
print(f' now we have leading zeros in {number:02d}')

Regardez ce bon post à propos de cette fonctionnalité.

44
SergioAraujo

Python 2.6 permet ceci:

add_nulls = lambda number, zero_count : "{0:0{1}d}".format(number, zero_count)

>>>add_nulls(2,3)
'002'
21
clorz

Pour Python 3 et au-delà: str.zfill () est toujours l'option la plus lisible.

Mais c’est une bonne idée d’examiner le nouveau et puissant str.format (). Que faire si vous voulez régler quelque chose qui n’est pas égal à 0?

    # if we want to pad 22 with zeros in front, to be 5 digits in length:
    str_output = '{:0>5}'.format(22)
    print(str_output)
    # >>> 00022
    # {:0>5} meaning: ":0" means: pad with 0, ">" means move 22 to right most, "5" means the total length is 5

    # another example for comparision
    str_output = '{:#<4}'.format(11)
    print(str_output)
    # >>> 11##

    # to put it in a less hard-coded format:
    int_inputArg = 22
    int_desiredLength = 5
    str_output = '{str_0:0>{str_1}}'.format(str_0=int_inputArg, str_1=int_desiredLength)
    print(str_output)
    # >>> 00022
14
YunliuStorage

Vous avez au moins deux options:

  • str.zfill: lambda n, cnt=2: str(n).zfill(cnt)
  • % mise en forme: lambda n, cnt=2: "%0*d" % (cnt, n)

Si sur Python> 2.5, voyez une troisième option dans la réponse de clorz.

5
tzot

Alternative simple au système intégré zfill.

Cette fonction prend x et la convertit en chaîne, et ajoute des zéros au début uniquement et uniquement si la longueur est trop courte:

def zfill_alternative(x,len=4): return ( (('0'*len)+str(x))[-l:] if len(str(x))<len else str(x) )

Pour résumer - la construction: zfill suffit, mais si quelqu'un est curieux de savoir comment mettre cela en oeuvre manuellement, voici un autre exemple.

2

Une conversion simple serait (encore une fois avec une fonction):

def add_nulls2(int, cnt):
    nulls = str(int)
    for i in range(cnt - len(str(int))):
        nulls = '0' + nulls
    return nulls
1
rpr