我从Currency formatting in Python学到,使用locale模块将数字格式化为货币。例如,
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import locale
value = 123456789
l = locale.setlocale(locale.LC_ALL, '') # LC_CTYPE=en_US.UTF-8;LC_NUMERIC=fr_FR.UTF-8;LC_TIME=fr_FR.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=fr_FR.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=fr_FR.UTF-8;LC_NAME=fr_FR.UTF-8;LC_ADDRESS=fr_FR.UTF-8;LC_TELEPHONE=fr_FR.UTF-8;LC_MEASUREMENT=fr_FR.UTF-8;LC_IDENTIFICATION=fr_FR.UTF-8
s = locale.currency(value, grouping=True) # 123 456 789,00 €
locale.setlocale(locale.LC_ALL, 'en_US.utf-8')
s = locale.currency(value, grouping=True) # $123,456,789.00
locale.setlocale(locale.LC_ALL, 'en_US') # WHY? locale.Error: unsupported locale setting
s = locale.currency(value, grouping=True)
我想将数字格式化为其他货币,比如de_DE
。我遇到了locale.Error: unsupported locale setting
问题,因为区域设置de_DE
不在locale -a
列表中。
locale.setlocale(locale.LC_ALL, 'de_DE') # locale.Error: unsupported locale setting
s = locale.currency(value, grouping=True)
一种解决方案是将此区域设置添加到我的机器中。有没有更好的方法?
发布于 2016-06-01 22:30:19
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'
或者在您的情况下是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 €
发布于 2019-07-29 17:05:13
作为参考(对于那些希望设置类似于设置货币格式的数字的人),可以使用locale.format_string来设置数字的格式
value = 123456789
import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
print(locale.format_string('%.2f', value, True))
将会返回
123.456.789,00
发布于 2021-11-18 11:42:18
我知道有两种解决方案:
Babel
Babel是最好的解决方案,因为您可以选择任何货币,而不管语言环境如何。
缺点是它的文档记录得很少。要了解所有选项,您必须读取要使用的函数的Babel source code
安装Babel:
$ pip install Babel
使用方法:
import babel.numbers
amount = 123456789.123
print(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.12
print(babel.numbers.format_currency(amount, '', locale='en_CA'))
# 123,456,789.12
localize.currency()
locale.currency()
的一个限制是它假定与区域设置相匹配的货币。例如en_US => $/USD
和fr_FR => €/EUR
,因此如果显示的货币与区域设置不匹配,您可能希望在之后使用String.replace()
方法替换货币符号。
根据区域设置,例如en_US
或en_GB
、fr_FR
或fr_CA
,它将知道:
要使用的小数点分隔符(例如100,00
)
1.000
)
100.00
vs 100,00
)
1,000
vs 1.000
)
€100
vs USD 100
或$100
vs $100
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)
可选参数如下
# which currency symbol to use, and where to place it
symbol=True and international=True # => 'USD 100.00'
symbol=True and international=False # => '$100.00'
symbol=False # => '100.00'
# thousands separator
grouping = True # => '1000.00'
grouping = False # => '1,000.00'
https://stackoverflow.com/questions/37579712
复制相似问题