212 votes

Formatage des devises en Python

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

Comment puis-je le faire ?

0 votes

Vous avez soulevé un excellent point dans un commentaire ci-dessous, @RailsSon : vous voulez imprimer des £ pour afficher une devise spécifique, mais employer cet affichage en utilisant une expression japonaise pour les chiffres financiers. Je trouve étrange que votre requête n'ait pas été implémentée dans le langage en découplant le module locale l'utilisation par le module de la valeur de la monnaie et des propriétés d'affichage de cette monnaie.

1 votes

@yurisich c'est maintenant, vous pouvez définir LC_MONETARY et LC_NUMERIC à des locales différentes.

280voto

S.Lott Points 207588

Voir le locale module.

Cette fonction permet de formater les devises (et les dates).

>>> 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'

16 votes

Comment formater correctement une devise non native, par exemple en indiquant un coût en livres sterling pour un rapport en japonais ?

3 votes

@TokenMacGuy : C'est une question piège. Un rapport japonais signifie des règles japonaises de virgule et de décimale, mais le symbole monétaire de la livre sterling n'est pas trivialement pris en charge par la locale. Vous devez créer une définition locale personnalisée.

0 votes

Si le nombre du donneur est négatif, il retourne la valeur entre "( )" pourquoi ?

114voto

nate c Points 3909

Nouveau dans la version 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

11 votes

C'est bien mais cela ne répond pas vraiment à la question, car la solution demandée inclurait un symbole monétaire, et vous codifiez également en dur le nombre de chiffres après la virgule, ce qui est spécifique à la locale. Il existe de nombreuses autres raisons d'utiliser la réponse locale acceptée si vous ne voulez pas seulement placer des virgules.

8 votes

@mrooney Il existe également de nombreuses raisons de ne pas utiliser la réponse locale acceptée, comme par exemple ne pas importer un module entier.

1 votes

@Josh, "from locale import currency".

58voto

glenc Points 1087

Je ne sais pas trop pourquoi on n'en parle pas davantage sur Internet (ou sur ce fil de discussion), mais la Babel (et les utilitaires Django) des gars de Edgewall est génial pour le formatage des devises (et beaucoup d'autres tâches i18n). Il est intéressant car il ne souffre pas du besoin de tout faire globalement comme le module local de Python.

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

3 votes

Note très tardive : en testant ce système, il ne semble pas formater intelligemment les devises, car il colle simplement le symbole approprié avant le montant (formaté dans ce qui semble être la locale que vous avez définie, ce qui est raisonnable), sans tenir compte du fait que cette devise utilise effectivement son symbole comme préfixe.

0 votes

@kungphu Que voulez-vous dire ? Voir babel.pocoo.org/fr/latest/api/

1 votes

@Julian Il semble que le locale argument pour format_currency peut être utilisé pour résoudre ce problème, mais soit ce n'était pas dans la doc il y a quatre ans (quand j'ai écrit ce commentaire), soit j'ai juste testé le code de cette réponse tel quel sans vérifier la doc.

18voto

user37986 Points 217

Mes paramètres locaux semblant incomplets, j'ai dû chercher au-delà de cette réponse de l'OS et j'ai trouvé :

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

Indépendant du système d'exploitation

Je voulais juste partager ici.

0 votes

Mais où est-ce qu'on appelle le def moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='') ?

12voto

simoes Points 858

Si vous utilisez OSX et que vous n'avez pas encore défini votre module local, cette première réponse ne fonctionnera pas ; vous recevrez l'erreur suivante :

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 y remédier, vous devrez utiliser les moyens suivants :

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

2 votes

Locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') fait l'affaire pour moi

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