web-dev-qa-db-fra.com

Ajouter des séparateurs de milliers 'décimales' à un nombre

Comment formater 1000000 à 1.000.000 en Python? où le '.' est le séparateur de milliers de marques décimales.

47
CarlosRibet

Si vous souhaitez ajouter un séparateur de milliers, vous pouvez écrire:

>>> '{0:,}'.format(1000000)
'1,000,000'

Mais cela ne fonctionne que dans Python 2.7 et supérieur.

Voir syntaxe de chaîne de format .

Dans les anciennes versions, vous pouvez utiliser locale.format () :

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'en_AU.utf8'
>>> locale.format('%d', 1000000, 1)
'1,000,000'

l'avantage supplémentaire d'utiliser locale.format() est qu'il utilisera le séparateur de milliers de votre locale, par exemple.

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'de_DE.utf-8')
'de_DE.utf-8'
>>> locale.format('%d', 1000000, 1)
'1.000.000'
99
Mikel

Je ne l'ai pas vraiment compris; mais voici ce que je comprends:

Vous voulez convertir 1123000 en 1.123.000. Vous pouvez le faire en utilisant le format:

http://docs.python.org/release/3.1.3/whatsnew/3.1.html#pep-378-format-specifier-for-thousands-separator

Exemple:

>>> format(1123000,',d')
'1,123,000'
17
utdemir

J'étends juste un peu la réponse ici :)

J'avais besoin d'un séparateur du millième et de la précision d'un nombre à virgule flottante.

Ceci peut être réalisé en utilisant la chaîne de format suivante:

> my_float = 123456789.123456789
> "{:0,.2f}".format(my_float)
'123,456,789.12'

Ceci décrit le mini-langage du format()- specifier:

[[fill]align][sign][#][0][width][,][.precision][type]

Source: https://www.python.org/dev/peps/pep-0378/#current-version-of-the-mini-language

12
jpihl

Une idée

def itanum(x):
    return format(x,',d').replace(",",".")

>>> itanum(1000)
'1.000'
1
Giovanni Gianni

S'appuyant sur la réponse de Mikel, j'ai implémenté sa solution comme celle-ci dans mon graphique matplotlib. J'ai pensé que certains pourraient trouver cela utile:

ax=plt.gca()
ax.get_xaxis().set_major_formatter(matplotlib.ticker.FuncFormatter(lambda x, loc: locale.format('%d', x, 1)))
1
Marcus Seuser

Utiliser itertools peut vous donner plus de flexibilité:

>>> from itertools import Zip_longest
>>> num = "1000000"
>>> sep = "."
>>> places = 3
>>> args = [iter(num[::-1])] * places
>>> sep.join("".join(x) for x in Zip_longest(*args, fillvalue=""))[::-1]
'1.000.000'
1
Eugene Yarmash

Voici seulement une réponse alternative . Vous pouvez utiliser l'opérateur split en python et à travers une logique étrange Voici le code

i=1234567890
s=str(i)
str1=""
s1=[Elm for Elm in s]
if len(s1)%3==0:
    for i in range(0,len(s1)-3,3):
        str1+=s1[i]+s1[i+1]+s1[i+2]+"."
    str1+=s1[i]+s1[i+1]+s1[i+2]
else:
    rem=len(s1)%3
    for i in range(rem):
        str1+=s1[i]
    for i in range(rem,len(s1)-1,3):
        str1+="."+s1[i]+s1[i+1]+s1[i+2]

print str1

Sortie

1.234.567.890
0
anand tripathi

Étrange que personne n'ait mentionné une solution simple avec regex:

import re
print(re.sub(r'(?<!^)(?=(\d{3})+$)', r'.', "12345673456456456"))

Donne le résultat suivant:

12.345.673.456.456.456

Cela fonctionne aussi si vous voulez séparer les chiffres avant la virgule:

re.sub(r'(?<!^)(?=(\d{3})+,)', r'.', "123456734,56456456")

donne:

123.456.734,56456456

l'expression régulière utilise lookahead pour vérifier que le nombre de chiffres après une position donnée est divisible par 3.

0
Andrey Tyukin