通天号格式_currency功能

问题描述 投票:3回答:3

我正在一个我们使用多种语言的网站上工作,为了显示价格/货币,我们使用了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 €
python python-2.7 babel currency
3个回答
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值打印没有第二个数字!

演示:

>>> 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
投票

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

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'))
© www.soinside.com 2019 - 2024. All rights reserved.