通天号格式_currency功能

时间:2014-08-21 12:19:21

标签: python python-2.7 babel currency

我正在使用多种语言的网站上工作,为了显示价格/货币,我们使用了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 €

3 个答案:

答案 0 :(得分:4)

您可以指定自定义格式:

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

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

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

演示:

>>> 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 €

答案 1 :(得分:1)

您必须使用格式添加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 €

答案 2 :(得分:0)

在语言环境是任意的情况下,手动重写格式会很痛苦,这里的a solution似乎有用。

以防万一,这是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'))