web-dev-qa-db-fra.com

Format de devise dans Python

Je cherche à formater un nombre comme 188518982.18 à 188 518 982,18 £ en utilisant Python.

Comment puis-je faire ceci?

136
RailsSon

Voir le module locale .

Ceci effectue le formatage de la monnaie (et de la date).

>>> import locale
>>> locale.setlocale( locale.LC_ALL, '' )
'English_United States.1252'
>>> locale.currency( 188518982.18 )
'$188518982.18'
>>> locale.currency( 188518982.18, grouping=True )
'$188,518,982.18'
183
S.Lott

Nouveau en 2.7

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

http://docs.python.org/dev/whatsnew/2.7.html#pep-0378

88
nate c

Pas tout à fait sûr pourquoi il n'est pas mentionné plus en ligne (ou sur ce fil), mais le paquetage Babel (et Django)) de Edgewall est génial pour le formatage monétaire (Et beaucoup d’autres tâches i18n.) C’est bien parce qu’il ne souffre pas de la nécessité de tout faire globalement comme le module de base Python locale.

L'exemple donné par le PO serait simplement:

>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
40
glenc

Ceci est un ancien post, mais je viens de mettre en œuvre la solution suivante qui:

  • Ne nécessite pas de modules externes
  • Ne nécessite pas de créer une nouvelle fonction
  • Peut être fait en ligne
  • Gère plusieurs variables
  • Traite les montants en dollars négatifs

Code:

num1 = 4153.53
num2 = -23159.398598

print 'This: ${:0,.0f} and this: ${:0,.2f}'.format(num1, num2).replace('$-','-$')

Sortie:

This: $4,154 and this: -$23,159.40

Et pour l'affiche originale, évidemment, changez simplement $ pour £

23
elPastor

Mes paramètres régionaux semblaient incomplets, donc j’ai aussi cherché au-delà de cela SO answer and found:

http://docs.python.org/library/decimal.html#recipes

Indépendant du système d'exploitation

Je voulais juste partager ici.

16
user37986

Si vous utilisez OSX et que vous n'avez pas encore défini votre module de paramètres régionaux, cette première réponse ne fonctionnera pas, vous recevrez le message d'erreur suivant:

Traceback (most recent call last):File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py", line 221, in currency
raise ValueError("Currency formatting is not possible using "ValueError: Currency formatting is not possible using the 'C' locale.

Pour remédier à cela, vous devrez utiliser les éléments suivants:

locale.setlocale(locale.LC_ALL, 'en_US')
9
simoes

Si j'étais vous, j'utiliserais BABEL: http://babel.pocoo.org/en/latest/index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')
3
Carlos

Oh, c'est une bête intéressante.

J'ai passé beaucoup de temps à comprendre cela, il y a trois problèmes principaux qui diffèrent d'un endroit à l'autre: - le symbole monétaire et la direction - le séparateur de milliers - le point décimal

J'ai écrit ma propre implémentation assez détaillée de ce qui fait partie du kiwi python), consultez la source LGPL: ed ici:

http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup

Le code est légèrement spécifique à Linux/Glibc, mais il ne devrait pas être trop difficile à adopter pour Windows ou d'autres Unix.

Une fois que vous avez cela installé, vous pouvez faire ce qui suit:

>>> from kiwi.datatypes import currency
>>> v = currency('10.5').format()

Ce qui vous donnera ensuite:

'$10.50'

ou

'10,50 kr'

Selon les paramètres régionaux actuellement sélectionnés.

Le principal avantage de cet article est qu'il fonctionnera avec les anciennes versions de Python. locale.currency a été introduit dans python 2.5.

3
Johan Dahlin

#imprimer la variable 'Total:' dans un format qui ressemble à ceci: '9,348.237'

print ('Total:',   '{:7,.3f}'.format(zum1))

où le nombre '{: 7, .3f}' est le nombre d'espaces pour formater le nombre dans ce cas est un million avec 3 décimales. Ensuite, vous ajoutez le '.format (zum1). Le zum1 est la variable qui a le grand nombre pour la somme de tous les nombres dans mon programme particulier. Variable peut être tout ce que vous décidez d'utiliser.

1
Marie

Je suis venu pour regarder la même chose et trouvé python-money pas vraiment utilisé encore mais peut-être un mélange des deux serait bon

0
James Brooks

Un lambda pour le calculer dans une fonction, avec l'aide de réponse de @Nate

converter = lambda amount, currency: "%s%s%s" %(
    "-" if amount < 0 else "", 
    currency, 
    ('{:%d,.2f}'%(len(str(amount))+3)).format(abs(amount)).lstrip())

puis,

>>> converter(123132132.13, "$")
'$123,132,132.13'

>>> converter(-123132132.13, "$")
'-$123,132,132.13'
0
mu 無

"{:0,.2f}".format(float(your_numeric_value)) in Python 3 fait le travail; il donne quelque chose comme l'une des lignes suivantes:

10,938.29
10,899.00
10,898.99
2,328.99
0

Simple python code!

def format_us_currency(value):
    value=str(value)
    if value.count(',')==0:
        b,n,v='',1,value
        value=value[:value.rfind('.')]
        for i in value[::-1]:
            b=','+i+b if n==3 else i+b
            n=1 if n==3 else n+1
        b=b[1:] if b[0]==',' else b
        value=b+v[v.rfind('.'):]
    return '$'+(value.rstrip('0').rstrip('.') if '.' in value else value)
0
Vanjith