J'essaie d'imprimer un entier en Python 2.6.1 avec des virgules comme milliers de séparateurs. Par exemple, je veux montrer le nombre 1234567
comme 1,234,567
. Comment pourrais-je procéder? J'ai vu de nombreux exemples sur Google, mais je cherche le moyen pratique le plus simple.
Il n'est pas nécessaire qu'il soit spécifique aux paramètres régionaux pour choisir entre les périodes et les virgules. Je préférerais quelque chose d'aussi simple que raisonnablement possible.
python
number-formatting
Elias Zamaria
la source
la source
{val:,}.format(val=val)
f"{2 ** 64 - 1:,}"
Je l'ai fait fonctionner:
Bien sûr, vous n'avez pas besoin de prise en charge de l'internationalisation, mais c'est clair, concis et utilise une bibliothèque intégrée.
PS Ce "% d" est le formateur habituel de style%. Vous ne pouvez avoir qu'un seul formateur, mais cela peut être tout ce dont vous avez besoin en termes de largeur de champ et de paramètres de précision.
PPS Si vous ne pouvez pas vous rendre
locale
au travail, je suggère une version modifiée de la réponse de Mark:La récursivité est utile pour le cas négatif, mais une récursivité par virgule me semble un peu excessive.
la source
locale
moi, j'en utilise le moins possible.setlocale
utiliser la valeur par défaut, qui, nous l'espérons, sera appropriée.Pour l'inefficacité et l'illisibilité, il est difficile de battre:
la source
lambda x: (lambda s: ','.join(["%s%s%s" % (x[0], x[1] or '', x[2] or '') for x in itertools.izip_longest(s[::-1][::3], s[::-1][1::3], s[::-1][2::3])])[::-1].replace('-,','-'))(str(x))
juste pour garder le thème de l'obscurcissement.Voici le code de regroupement des paramètres régionaux après avoir supprimé les parties non pertinentes et nettoyé un peu:
(Ce qui suit ne fonctionne que pour les entiers)
Il y a déjà de bonnes réponses ici. Je veux juste ajouter ceci pour référence future. En python 2.7, il y aura un spécificateur de format pour le séparateur de milliers. Selon les documents python, cela fonctionne comme ceci
En python3.1, vous pouvez faire la même chose comme ceci:
la source
Je suis surpris que personne n'ait mentionné que vous pouvez faire cela avec des chaînes f en Python 3.6 aussi simple que cela:
... où la partie après les deux-points est le spécificateur de format. La virgule est le caractère de séparation que vous souhaitez, donc
f"{num:_}"
utilise des traits de soulignement au lieu d'une virgule.Cela équivaut à utiliser
format(num, ",")
pour les anciennes versions de python 3.la source
Voici un remplacement d'expression régulière d'une ligne:
Fonctionne uniquement pour les sorties intégrées:
Ou pour les flottants de moins de 4 chiffres, remplacez le spécificateur de format par
%.3f
:NB: ne fonctionne pas correctement avec plus de trois chiffres décimaux car il tentera de regrouper la partie décimale:
Comment ça fonctionne
Décomposons-le:
la source
C'est ce que je fais pour les flotteurs. Bien que, honnêtement, je ne sais pas pour quelles versions il fonctionne - j'utilise 2.7:
Retours: 4385893,38
Mise à jour: j'ai récemment rencontré un problème avec ce format (je ne pouvais pas vous en dire la raison exacte), mais j'ai pu le corriger en supprimant
0
:la source
Vous pouvez aussi utiliser
'{:n}'.format( value )
pour une représentation locale. Je pense que c'est le moyen le plus simple pour une solution locale.Pour plus d'informations, recherchez
thousands
dans Python DOC .Pour la devise, vous pouvez utiliser
locale.currency
, en définissant le drapeaugrouping
:Code
Production
la source
Elargissant légèrement la réponse d'Ian Schneider:
Si vous souhaitez utiliser un séparateur de milliers personnalisé, la solution la plus simple est:
Exemples
Si vous voulez la représentation allemande comme ça, ça devient un peu plus compliqué:
la source
'{:_.2f}'.format(12345.6789).replace('.', ',').replace('_', '.')
Je suis sûr qu'il doit y avoir une fonction de bibliothèque standard pour cela, mais c'était amusant d'essayer de l'écrire moi-même en utilisant la récursivité alors voici ce que j'ai trouvé:
Cela dit, si quelqu'un d'autre trouve un moyen standard de le faire, vous devriez l'utiliser à la place.
la source
Des commentaires à la recette d' activation 498181, j'ai retravaillé ceci:
Il utilise la fonction d'expressions régulières: lookahead ie
(?=\d)
à- pour s'assurer que seuls les groupes de trois chiffres qui ont un chiffre après eux obtiennent une virgule. Je dis «après» parce que la chaîne est inversée à ce stade.[::-1]
inverse simplement une chaîne.la source
La réponse acceptée est correcte, mais je préfère en fait
format(number,',')
. Plus facile à interpréter et à mémoriser.https://docs.python.org/3/library/functions.html#format
la source
Python 3
-
Entiers (sans décimale):
"{:,d}".format(1234567)
-
Flotteurs (avec décimale):
"{:,.2f}".format(1234567)
où le nombre avant
f
spécifie le nombre de décimales.-
Prime
Fonction de démarrage rapide et sale pour le système de numérotation des lakhs / crores indiens (12, 34, 567):
https://stackoverflow.com/a/44832241/4928578
la source
à partir de Python version 2.6, vous pouvez le faire:
Pour les versions Python <2.6 et juste pour votre information, voici 2 solutions manuelles, elles transforment les flottants en pouces mais les nombres négatifs fonctionnent correctement:
quelques choses à noter ici:
Et une version plus hardcore:
la source
Je suis un débutant en Python, mais un programmeur expérimenté. J'ai Python 3.5, je peux donc simplement utiliser la virgule, mais c'est néanmoins un exercice de programmation intéressant. Prenons le cas d'un entier non signé. Le programme Python le plus lisible pour ajouter des milliers de séparateurs semble être:
Il est également possible d'utiliser une liste de compréhension:
C'est plus court et pourrait être un doublure, mais vous devrez faire de la gymnastique mentale pour comprendre pourquoi cela fonctionne. Dans les deux cas, nous obtenons:
La première version est le choix le plus judicieux, si vous voulez que le programme soit compris.
la source
En voici un qui fonctionne aussi pour les flotteurs:
Exemple d'utilisation:
la source
float2comma(12031023.1323)
renvoie: '12, 031,023.132,3 'Un liner pour Python 2.5+ et Python 3 (int positif uniquement):
la source
Solution universelle
J'ai trouvé quelques problèmes avec le séparateur de points dans les réponses précédentes les plus votées. J'ai conçu une solution universelle où vous pouvez utiliser ce que vous voulez comme mille séparateurs sans modifier les paramètres régionaux . Je sais que ce n'est pas la solution la plus élégante, mais elle fait le travail. N'hésitez pas à l'améliorer!
la source
Cela fait de l'argent avec les virgules
la source
J'ai une version python 2 et python 3 de ce code. Je sais que la question a été posée pour python 2 mais maintenant (8 ans plus tard lol), les gens vont probablement utiliser python 3.
Code Python 3:
Code Python 2: (Modifier. Le code python 2 ne fonctionne pas. Je pense que la syntaxe est différente).
la source
J'utilise python 2.5, donc je n'ai pas accès au formatage intégré.
J'ai regardé le code Django intcomma (intcomma_recurs dans le code ci-dessous) et j'ai réalisé qu'il était inefficace, car il est récursif et la compilation de l'expression régulière à chaque exécution n'est pas non plus une bonne chose. Ce n'est pas nécessairement un «problème» car Django n'est pas vraiment CELA concentré sur ce type de performances de bas niveau. De plus, je m'attendais à un facteur de différence de performances de 10, mais ce n'est que 3 fois plus lent.
Par curiosité, j'ai implémenté quelques versions d'intcomma pour voir quels sont les avantages en termes de performances lors de l'utilisation de regex. Mes données de test concluent un léger avantage pour cette tâche, mais étonnamment pas grand-chose du tout.
J'ai également été heureux de voir ce que je soupçonnais: l'utilisation de l'approche xrange inverse n'est pas nécessaire dans le cas sans regex, mais cela rend le code légèrement meilleur au prix de ~ 10% de performances.
En outre, je suppose que ce que vous passez est une chaîne et ressemble un peu à un nombre. Résultats indéterminés autrement.
Et voici les résultats des tests:
la source
c'est cuit en python par PEP -> https://www.python.org/dev/peps/pep-0378/
utilisez simplement le format (1000, ', d') pour afficher un entier avec un séparateur de milliers
il y a plus de formats décrits dans le PEP,
la source
Voici une autre variante utilisant une fonction de générateur qui fonctionne pour les entiers:
Et voici un test:
la source
Juste sous-classe
long
(oufloat
, ou autre). C'est très pratique, car de cette façon, vous pouvez toujours utiliser vos nombres dans les opérations mathématiques (et donc le code existant), mais ils s'imprimeront tous bien dans votre terminal.la source
__repr__()
la bonne méthode pour remplacer? Je suggère de passer outre__str__()
et de laisser__repr__()
seul, car celaint(repr(number(928374)))
devrait fonctionner, maisint()
étouffera les virgules.number(repr(number(928374)))
cela ne fonctionne pas, nonint(repr(number(928374)))
. Tout de même, pour que cette approche fonctionne directement avecprint
, comme l'OP l'a demandé, la__str__()
méthode devrait être celle qui a été remplacée plutôt que__repr__()
. Quoi qu'il en soit, il semble y avoir un bogue dans la logique d'insertion de virgule de base.Italie:
la source
Pour les flotteurs:
Pour les pouces:
la source
float('1,234.52'.translate(None, ','))
pourrait être plus simple et peut-être plus rapide.