【发布时间】:2015-03-15 04:53:00
【问题描述】:
我想生成一个如下所示的 XML:
<amount currency="AUD">123.00</amount>
我可以通过执行 "{0:.2f}".format(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'
但是有两个问题:
- 我不想维护从货币代码 KWD -> 到区域设置代码 ar_KW 的映射。
- locale.setlocale 设置程序的全局状态,这在服务器中是不可取的,因为多个线程可能想要转换不同的货币
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)。
【问题讨论】:
标签: python serialization localization currency