Je cherche à formater un nombre comme 188518982.18 en £188,518,982.18 en utilisant Python.
Comment puis-je le faire ?
Je cherche à formater un nombre comme 188518982.18 en £188,518,982.18 en utilisant Python.
Comment puis-je le faire ?
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'
Comment formater correctement une devise non native, par exemple en indiquant un coût en livres sterling pour un rapport en japonais ?
@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.
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.
@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.
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
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.
@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.
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.
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')
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.
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.