如何使用区域设置格式化Decimal
?
通过示例来描述,我正在尝试定义一个函数f
,以便在美国英语语言环境中:
f(Decimal('5000.00')) == '5,000.00'
f(Decimal('1234567.000000')) == '1,234,567.000000'
有些不起作用的事情:
f = str
不使用区域设置; f(Decimal('5000.00')) == '5000.00'
f = lambda d: locale.format('%f', d)
不保留小数精度; f(Decimal('5000.00')) == '5000.000000'
f = lambda d: locale.format('%.2f', d)
使用固定的精度,这不是我所追求的; f(Decimal('1234567.000000')) == '1234567.00'
答案 0 :(得分:4)
阅读 * - global_merge_vars array global merge variables to use for all recipients. You can override these per recipient.
* - global_merge_vars[] struct a single global merge variable
* - name string the global merge variable's name. Merge variable names are case-insensitive and may not start with _
* - content mixed the global merge variable's content
模块的来源,decimal
提供完整的PEP 3101支持,您只需选择正确的演示文稿类型即可。在这种情况下,您需要Decimal.__format__
类型。根据PEP 3101规范,此:n
具有以下属性:
' N' - 数量。这与' g'相同,只是它使用了 当前语言环境设置插入适当的 数字分隔符。
这比其他答案简单,并且避免了原始答案中的浮点精度问题(保留在下面):
:n
您可以告诉格式字符串使用与十进制本身一样多的精度,并使用语言环境格式化程序:
>>> import locale
>>> from decimal import Decimal
>>>
>>> def f(d):
... return '{0:n}'.format(d)
...
>>>
>>> locale.setlocale(locale.LC_ALL, 'en_us')
'en_us'
>>> print f(Decimal('5000.00'))
5,000.00
>>> print f(Decimal('1234567.000000'))
1,234,567.000000
>>> print f(Decimal('123456700000000.123'))
123,456,700,000,000.123
>>> locale.setlocale(locale.LC_ALL, 'no_no')
'no_no'
>>> print f(Decimal('5000.00'))
5.000,00
>>> print f(Decimal('1234567.000000'))
1.234.567,000000
>>> print f(Decimal('123456700000000.123'))
123.456.700.000.000,123
请注意,如果您的小数与实数对应,则无效,但如果小数为def locale_format(d):
return locale.format('%%0.%df' % (-d.as_tuple().exponent), d, grouping=True)
或NaN
或类似值,则无法正常工作。如果您的输入中存在这些可能性,则需要以格式化方法对其进行说明。
+Inf
答案 1 :(得分:3)
使用 Python 3.5+ 的现代 Python 方法是:
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, "de_DE")
>>> f'{Decimal("5000.00"):n}'
'5.000,00'
>>> locale.setlocale(locale.LC_NUMERIC, "en_US")
'en_US'
>>> f'{Decimal("5000.00"):n}'
'5,000.00'
F 字符串支持高级格式。因此,不需要额外的 f
函数。 Babel for Python 会给您带来更多便利:
>>> from babel import numbers
>>> numbers.format_decimal(.2345, locale='en_US')
'0.234'
>>> numbers.format_decimal(.2345, locale='de_DE')
'0,234'