690 votes

Comment imprimer un nombre avec des virgules comme milliers séparateurs ?

J’essaie d’imprimer un entier en Python 2.6.1 avec des virgules comme milliers séparateur. Par exemple, je veux montrer le nombre 1234567 comme « 1 234 567 ». Comment pourrais-je aller à faire cela ? J’ai vu beaucoup d’exemples sur Google, mais je cherche le moyen le plus simple pratique.

Il n’a pas besoin d’être spécifiques aux paramètres régionaux de choisir entre des périodes et des virgules. J’aurais préféré quelque chose d’aussi simple que possible.

1648voto

Ian Schneider Points 2671

Je préfère aussi, « moyen le plus simple pratique ». Pour > = 2.7 :

http://docs.Python.org/library/String.html#format-Specification-mini-Language

282voto

Mike DeSimone Points 20059

J'ai eu ce travail:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US')
'en_US'
>>> locale.format("%d", 1255000, grouping=True)
'1,255,000'

Bien sûr, vous n'avez pas besoin de support de l'internationalisation, mais il est clair, concis, et utilise une bibliothèque intégrée.

P. S. "%d", c'est l'habituel %style de formatage. Vous ne pouvez avoir qu'un formateur, mais il peut être tout ce que vous avez besoin en termes de largeur de champ et la précision des paramètres.

P. P. S. Si vous ne pouvez pas obtenir de l' locale de travail, je proposerais une version modifiée de la Marque de la réponse:

def intWithCommas(x):
    if type(x) not in [type(0), type(0L)]:
        raise TypeError("Parameter must be an integer.")
    if x < 0:
        return '-' + intWithCommas(-x)
    result = ''
    while x >= 1000:
        x, r = divmod(x, 1000)
        result = ",%03d%s" % (r, result)
    return "%d%s" % (x, result)

La récursivité est utile pour le cas négatif, mais l'un de récursivité par des virgules semble un peu excessif pour moi.

120voto

Kasey Kirkham Points 287

Pour inefficacité et illisible, il est difficile à battre :

94voto

Nadia Alramli Points 40381

Voici les paramètres régionaux du code de regroupement après le retrait hors de propos pièces et le nettoyage un peu de tout:

(Ce qui suit ne fonctionne que pour les entiers)

def group(number):
    s = '%d' % number
    groups = []
    while s and s[-1].isdigit():
        groups.append(s[-3:])
        s = s[:-3]
    return s + ','.join(reversed(groups))

>>> group(-23432432434.34)
'-23,432,432,434'

Il y a déjà quelques bonnes réponses ici. Je veux juste ajouter que cette référence pour l'avenir. En python 2.7, il va être un spécificateur de format pour le séparateur de milliers. Selon python docs il fonctionne comme ceci

>>> '{:20,.2f}'.format(f)
'18,446,744,073,709,551,616.00'

En python3.1 vous pouvez faire la même chose comme ceci:

>>> format(1234567, ',d')
'1,234,567'

37voto

Daniel Fortunov Points 12044

Voici une ligne de regex de remplacement:

re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1,", "%d" % val)

Fonctionne uniquement pour les inegral sorties:

import re
val = 1234567890
re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1,", "%d" % val)
# Returns: '1,234,567,890'

val = 1234567890.1234567890
# Returns: '1,234,567,890'

Ou pour des flotteurs avec moins de 4 chiffres, changer le spécificateur de format d' %.3f:

re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1,", "%.3f" % val)
# Returns: '1,234,567,890.123'

NB: Ne fonctionne pas correctement avec plus de trois chiffres après la virgule qu'il va tenter de groupe de la partie décimale:

re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1,", "%.5f" % val)
# Returns: '1,234,567,890.12,346'

Comment ça marche

Nous allons le décomposer:

re.sub(pattern, repl, string)

pattern = \
    "(\d)           # Find one digit...
     (?=            # that is followed by...
         (\d{3})+   # one or more groups of three digits...
         (?!\d)     # which are not followed by any more digits.
     )",

repl = \
    r"\1,",         # Replace that one digit by itself, followed by a comma,
                    # and continue looking for more matches later in the string.
                    # (re.sub() replaces all matches it finds in the input)

string = \
    "%d" % val      # Format the string as a decimal to begin with

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X