Qu'est-ce qu'une façon Pythonique 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?
python
string
zero-padding
Nicolas Gervais
la source
la source
python >= 2.6
sont incorrects. Cette syntaxe ne fonctionne paspython >= 3
. Vous pouvez le changer enpython < 3
, mais puis-je suggérer à la place de toujours utiliser des parenthèses et d'omettre complètement les commentaires (encourageant l'utilisation recommandée)?'{:03d} {:03d}'.format(1, 2)
affecte implicitement les valeurs dans l'ordre.print
déclaration, alors que ce devrait être uneprint
fonction sur Python 3? J'ai édité dans les parens; puisqu'une seule chose est en cours d'impression, elle fonctionne de manière identique sur Py2 et Py3.Utilisez simplement la méthode rjust de l'objet chaîne.
Cet exemple crée une chaîne de 10 caractères, complétant au besoin.
la source
En outre
zfill
, vous pouvez utiliser la mise en forme générale des chaînes:Documentation pour la mise en forme de chaîne et f-cordes .
la source
format
place, et les gens interprètent généralement cela comme une intention de déconseiller.Pour Python 3.6+ utilisant des chaînes f:
Pour Python 2 à Python 3.5:
la source
si vous voulez le contraire:
la source
str(n).zfill(width)
fonctionnera avecstring
s,int
s,float
s ... et est compatible Python 2. x et 3. x :la source
Pour ceux qui sont venus ici pour comprendre et pas seulement une réponse rapide. Je fais cela en particulier pour les chaînes de temps:
la source
str.zfill
est spécifiquement destiné à ce faire:Notez qu'il est spécifiquement destiné à gérer les chaînes numériques comme demandé, et déplace un
+
ou-
vers le début de la chaîne:Voici l'aide sur
str.zfill
:Performance
C'est également la plus performante des méthodes alternatives:
Pour comparer au mieux les pommes aux pommes pour la
%
méthode (notez qu'elle est en fait plus lente), qui pré-calculera autrement:la mise en oeuvre
Avec un peu de fouille, j'ai trouvé l'implémentation de la
zfill
méthode dansObjects/stringlib/transmogrify.h
:Passons en revue ce code C.
Il analyse d'abord l'argument positionnellement, ce qui signifie qu'il n'autorise pas les arguments de mots clés:
Il vérifie ensuite si c'est la même longueur ou plus, auquel cas il retourne la chaîne.
zfill
appelspad
(cettepad
fonction est également appelée parljust
,rjust
etcenter
aussi bien). Cela copie essentiellement le contenu dans une nouvelle chaîne et remplit le remplissage.Après l'appel
pad
,zfill
déplace n'importe quel précédent+
ou-
au début de la chaîne.Notez que pour que la chaîne d'origine soit réellement numérique, il n'est pas nécessaire:
la source
+
et-
, et j'ai ajouté un lien vers les documents!Voir la documentation imprimée pour tous les détails passionnants!
Mise à jour pour Python 3.x (7,5 ans plus tard)
Cette dernière ligne devrait maintenant être:
C'est-à-dire
print()
maintenant une fonction, pas une déclaration. Notez que je préfère toujours leprintf()
style Old School parce que, IMNSHO, il se lit mieux et parce que, euh, j'utilise cette notation depuis janvier 1980. Quelque chose ... de vieux chiens .. quelque chose de ... de nouveaux trucs.la source
"%0*d" % (width, x)
est interprété par python?Lorsque vous utilisez Python
>= 3.6
, la manière la plus propre consiste à utiliser des chaînes f avec un formatage de chaîne :Je préfère formater avec un
int
, car ce n'est qu'alors que le signe est traité correctement:la source
Pour les codes postaux enregistrés sous forme d'entiers:
la source
Comparaison rapide du timing:
J'ai fait différents tests de différentes répétitions. Les différences ne sont pas énormes, mais dans tous les tests, la
zfill
solution a été la plus rapide.la source
Une autre approche serait d'utiliser une compréhension de liste avec une condition vérifiant les longueurs. Voici une démonstration:
la source
C'est ok aussi:
la sortie sera donc: "02:07:03"
la source
Vous pouvez également répéter «0», l'ajouter au début
str(n)
et obtenir la tranche de largeur la plus à droite. Petite expression rapide et sale.la source