Format Numbers As Currency In Python
Solution 1:
In [22]: from babel.numbers import format_decimal
In [23]: format_decimal(12345, locale='de_DE')
Out[23]: u'12.345'
In [24]: format_decimal(1.2345, locale='sv_SE')
Out[24]: u'1,234'Or in your case format_currency:
In [7]: from babel.numbers import format_currency
In [8]: print format_currency(1099.98, 'USD', locale='en_US')
$1,099.98
In [9]: print format_currency(1099.98, 'USD', locale='es_CO')
1.099,98 US$
In [10]: print format_currency(1099.98, 'EUR', locale='de_DE')
1.099,98 €
Solution 2:
For reference (for those that are looking to format numbers similar to how you would format currency), you can use locale.format_string to format numbers
value = 123456789import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
print(locale.format_string('%.2f', value, True))
Would return
123.456.789,00
Solution 3:
I know of two solutions to this:
Babel
Babel is the best solution because you can choose any currency, regardless of the locale.
The down side is that it's poorly documented. To know all the options, you'll have to read the Babel source code for the function you want to use
Install Babel:
$ pip install Babel
How to use:
import babel.numbers
amount = 123456789.123print(babel.numbers.format_currency(amount, 'EUR', locale='fr_CA'))
# 123 456 789,12 €print(babel.numbers.format_currency(amount, 'EUR', locale='en_CA'))
# €123,456,789.12print(babel.numbers.format_currency(amount, '', locale='en_CA'))
# 123,456,789.12localize.currency()
One limitation of locale.currency() is that it presumes the currency that matches the locale. For example en_US => $/USD and fr_FR => €/EUR So you may want to use the String.replace() method to replace the currency symbol after if the displayed currency doesn't match the locale.
Based on the locale setting, for example en_US or en_GB, fr_FR or fr_CA, it will know:
- Which decimal separator to use (eg
100.00vs100,00) - Which thousands separator to use (eg
1,000vs1.000) - Which currency symbol to use (eg
$100vs€100orUSD 100vsEUR 100) - Where to place the currency symbol (eg
$100vs100 $)
import locale
locale.setlocale(locale.LC_ALL, 'fr_FR')
amount = 123456789.123
grouping = True# thousands separator# '123.456.789,12 Eu'
locale.currency(amount, symbol=True, grouping=True, international=False)
# '123.456.789,12 EUR'
locale.currency(amount, symbol=True, grouping=True, international=False)
# '123.456,789'
locale.currency(amount, symbol=False, grouping=True)
# '123456,789'
locale.currency(amount, symbol=False, grouping=True)
The optional arguments are as follows
# which currency symbol to use, and where to place it
symbol=Trueand international=True# => 'USD 100.00'
symbol=Trueand international=False# => '$100.00'
symbol=False# => '100.00'# thousands separator
grouping = True# => '1000.00'
grouping = False# => '1,000.00'
Post a Comment for "Format Numbers As Currency In Python"