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