将货币金额舍入为传统上用于货币的小数位数

时间:2015-01-16 14:43:42

标签: python serialization localization currency

我想生成一个如下所示的XML:

<amount currency="AUD">123.00</amount>

我可以通过“{0:.2f}”。格式(123)很容易地制作它,这很好,花花公子;但是许多货币传统上没有用两个小数点表示,例如:

<amount currency="JPY">12345</amount>
<amount currency="KWD">12345.678</amount>
<amount currency="BTC">1.23456789</amount> # bonus point

我不希望像locale或babel提供的那样以最终用户为导向的本地化。这些面向用户的本地化库还可以本地化分组分隔符,小数点和添加货币符号,这在格式化货币以便向用户显示时很好,但这些不适合机器到机器的通信,因为它们使解析更多接收机很难。

来自语言环境的货币函数符号= False几乎是我想要的:

In [1]: locale.setlocale(locale.LC_ALL, 'ar_KW')
Out[1]: 'ar_KW'
In [2]: locale.currency(4, False)
Out[2]: '4.000'

但有两个问题:

  1. 我不想保留货币代码KWD的映射 - &gt;到区域代码ar_KW。
  2. locale.setlocale设置程序的全局状态,这在服务器中是不受欢迎的,因为多个线程可能想要转换不同的货币
  3. babel的format_currency甚至没有使用正确的小数位数:

    In [3]: babel.numbers.format_currency(4, 'KWD')
    Out[3]: u'KWD12.00'
    

    当然,我可以通过从this这样的列表中收集来维持这样一个字典,但这似乎应该是一个已经解决的问题。

    是否有一个python库知道如何使用正确的小数位数格式化货币金额?我希望能够这样称呼它:to_currency(amount=Decimal('12345.67890'), currency='OMR', symbol=False)

1 个答案:

答案 0 :(得分:0)

这对我有用:

>>> print babel.numbers.format_currency(4, 'KWD')
KWD4.000
>>> print babel.numbers.format_currency(4, 'KWD', currency_digits=False)
KWD4.00
>>> print babel.numbers.format_currency(4, 'KWD', locale="ar_KW")
د.ك.‏ 4.000