4

我正在一个我们使用多种语言的网站上工作,为了相应地显示价格/货币,我们使用了 babel 库。问题是在调用 format_currency 时,即使价格被显式转换为整数,它也始终返回美分部分。

例子:

>>> print format_currency(100, 'EUR', locale='fr_FR')
100,00 €

>>> print format_currency(int(100), 'EUR', locale='fr_FR')
100,00 €

是否有一种解决方法,以便返回值不包括美分部分以具有类似的东西

>>> print format_currency(int(100), 'EUR', locale='fr_FR')
100 €
4

3 回答 3

5

您可以指定自定义格式:

format_currency(100, 'EUR', format=u'#,##0\xa0¤', locale='fr_FR')

有关详细信息,请参阅LDML 标记规范;\xa0字节是一个U+00A0 NO-BREAK SPACE字符;而不是一个普通的空间。

fr_FR默认为,#,##0.00\xa0¤并且该.00部分表示小数部分应以两位数打印,如果不存在则填充。我上面的示例只是删除了小数部分,.##如果数字不是精确整数,您也可以使用它来允许小数,但请注意,在这种情况下,.5打印的值没有第二个数字!

演示:

>>> from babel.numbers import format_currency
>>> print format_currency(100, 'EUR', format=u'#,##0\xa0¤', locale='fr_FR')
100 €
>>> print format_currency(100.0, 'EUR', format=u'#,##0.##\xa0¤', locale='fr_FR')
100 €
于 2014-08-21T12:36:52.597 回答
3

您必须添加带有格式的 currency_digits 参数才能实现您的目标

>>> print(format_currency(100, 'EUR', locale='fr_FR')
100,00 €
>>> print(format_currency(100, 'EUR', locale='fr_FR', currency_digits=False))
100,00 €
>>> print(format_currency(100, 'EUR', format=u'#,##0\xa0¤', locale='fr_FR'))
100,00 €
>>> print(format_currency(100, 'EUR', format=u'#,##0\xa0¤', locale='fr_FR', currency_digits=False))
100 €
于 2017-07-10T13:57:29.917 回答
1

在语言环境是任意的情况下,手动重写格式会很痛苦,这是一个似乎可行的解决方案。

以防万一这是Akx在此 github 问题上提出的代码:

from babel import Locale
from babel.numbers import decimal

def custom_format_currency(value, currency, locale):
    value = decimal.Decimal(value)
    locale = Locale.parse(locale)
    pattern = locale.currency_formats['standard']
    force_frac = ((0, 0) if value == int(value) else None)
    return pattern.apply(value, locale, currency=currency, force_frac=force_frac)

print(custom_format_currency('2.50', 'EUR', 'fi'))
print(custom_format_currency('2.00', 'EUR', 'fi'))
于 2019-06-07T12:18:13.703 回答