web-dev-qa-db-fra.com

Python Ajouter une virgule dans la chaîne numérique

En utilisant Python v2, j'ai une valeur qui traverse mon programme Qui donne un nombre arrondi à 2 décimales à la fin:

comme ça:

print ("Total cost is: ${:0.2f}".format(TotalAmount))

Est-il possible d'insérer une virgule tous les 3 chiffres à gauche du séparateur décimal?

Par exemple: 10000,00 devient 10 000,00 ou 1000000,00 devient 1 000 000,00

Merci pour toute aide.

32
The Woo

En Python 2.7 ou supérieur, vous pouvez utiliser

print ("Total cost is: ${:,.2f}".format(TotalAmount))

Ceci est documenté dans PEP 378 .

(À partir de votre code, je ne peux pas dire quelle version de Python vous utilisez.)

61
Sven Marnach

Vous pouvez utiliser locale.currency si TotalAmount représente de l'argent. Cela fonctionne aussi sur Python <2.7:

>>> locale.setlocale(locale.LC_ALL, '')
'en_US.utf8'
>>> locale.currency(123456.789, symbol=False, grouping=True)
'123,456.79'

Remarque: cela ne fonctionne pas avec les paramètres régionaux C. Vous devez donc définir d'autres paramètres régionaux avant de les appeler.

15
jfs

si vous utilisez Python 3 ou une version ultérieure, voici une méthode plus simple pour insérer une virgule:

Première manière

value = -12345672
print (format (value, ',d'))

ou d'une autre manière

value = -12345672
print ('{:,}'.format(value)) 
9
cooldeal
'{:20,.2f}'.format(TotalAmount)
4
Peter Kelly

Une fonction qui fonctionne en python2.7 + ou python3.1 +

def comma(num):
    '''Add comma to every 3rd digit. Takes int or float and
    returns string.'''
    if type(num) == int:
        return '{:,}'.format(num)
    Elif type(num) == float:
        return '{:,.2f}'.format(num) # Rounds to 2 decimal places
    else:
        print("Need int or float as input to function comma()!")
4
dnaman7

Ce n'est pas particulièrement élégant mais devrait fonctionner aussi:

a = "1000000.00"
e = list(a.split(".")[0])
for i in range(len(e))[::-3][1:]:
    e.insert(i+1,",")
result = "".join(e)+"."+a.split(".")[1]
2
ThR37

J'ai commencé à apprendre Python il y a environ 5 heures, mais je pense avoir développé quelque chose pour les nombres entiers (désolé, je ne pouvais pas comprendre les flottants). Je suis au lycée, donc le code pourrait être beaucoup plus efficace; Je viens de faire quelque chose de neuf qui a du sens pour moi. Si quelqu'un a des idées sur la façon de s'améliorer avec de nombreuses explications sur son fonctionnement, faites-le moi savoir!

# Inserts comma separators
def place_value(num):
    perm_num = num  # Stores "num" to ensure it cannot be modified
    lis_num = list(str(num))  # Makes "num" into a list of single-character strings since lists are easier to manipulate
    if len(str(perm_num)) > 3:
        index_offset = 0  # Every time a comma is added, the numbers are all shifted over one
        for index in range(len(str(perm_num))):  # Converts "perm_num" to string so len() can count the length, then uses that for a range
            mod_index = (index + 1) % 3  # Locates every 3 index
            neg_index = -1 * (index + 1 + index_offset)  # Calculates the index that the comma will be inserted at
            if mod_index == 0:  # If "index" is evenly divisible by 3
                lis_num.insert(neg_index, ",")  # Adds comma place of negative index
                index_offset += 1  # Every time a comma is added, the index of all items in list are increased by 1 from the back
        str_num = "".join(lis_num)  # Joins list back together into string
    else:  # If the number is less than or equal to 3 digits long, don't separate with commas
        str_num = str(num)
    return str_num
0
Drake Johnson

Les réponses ci-dessus sont tellement plus agréables que le code que j'utilisais dans mon projet (pas de travail à la maison):

def commaize(number):
    text = str(number)
    parts = text.split(".")
    ret = ""
    if len(parts) > 1:
        ret = "."
        ret += parts[1] # Apparently commas aren't used to the right of the decimal point
    # The -1 offsets to len() and 0 are because len() is 1 based but text[] is 0 based
    for i in range(len(parts[0]) - 1,-1,-1):
        # We can't just check (i % 3) because we're counting from right to left
        #  and i is counting from left to right. We can overcome this by checking
        #  len() - i, although it needs to be adjusted for the off-by-one with a -1
        # We also make sure we aren't at the far-right (len() - 1) so we don't end
        #  with a comma
        if (len(parts[0]) - i - 1) % 3 == 0 and i != len(parts[0]) - 1:
            ret = "," + ret
        ret = parts[0][i] + ret
    return ret
0
QBFreak