PyCountry货币格式化'DE'alpha2国家代码的困境

时间:2014-05-04 20:45:25

标签: python currency-formatting

我有一个Python函数,它接受一个alpha2国家代码和一个价格字符串,其目的是获取该国家/地区的货币并使用该货币的currency.letter属性来使用字符串格式化提供的价格字符串内插。

上述工作到目前为止工作正常 - 但是当德国作为国家进行调用时,它会失败:

>>> import pycountry
>>> country = pycountry.countries.get(alpha2='DE')
>>> currency = pycountry.currencies.get(numeric=country.numeric)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/pymodules/python2.6/pycountry/db.py", line 83, in get
    return self.indices[field][value]
KeyError: '276'
>>>

pycountry.countries集合中不包含数字为276(德国数字)的货币 - 但它确实包含欧元。关于这可能是什么方式的任何想法?

3 个答案:

答案 0 :(得分:4)

不幸的是,国家/地区的数字代码与货币数字不同。根据ISO,&#34; Where possible the 3 digit numeric code is the same as the numeric country code&#34; - 但这显然不适用于欧元,这是由多个国家共享的。

欧元的数字是978,而不是276;显然,pycountry并没有提供国家数字和货币数字之间的映射。这里是原始表的链接(XML或XLS格式),因此如果您愿意,可以自己滚动... http://www.currency-iso.org/en/home/tables/table-a1.html

答案 1 :(得分:0)

不是我最喜欢的解决方案,但它确实有效。我需要一个针对这个问题的项目范围的解决方案:

# pycountry_patch.py
from pycountry import db, countries, DATABASE_DIR, Currencies as pycountryCurrencies
from django.conf import settings
import os.path

class Currencies(pycountryCurrencies):
    @db.lazy_load
    def get(self, **kw):
        assert len(kw) == 1, 'Only one criteria may be given.'
        field, value = kw.popitem()

        if field == 'numeric' and value in [countries.get(alpha2=x).numeric for x in settings.EUROPEAN_COUNTRIES]:
            value = '978'

        return self.indices[field][value]

currencies = Currencies(os.path.join(DATABASE_DIR, 'iso4217.xml'))

并在settings.py(不完整列表)中:

EUROPEAN_COUNTRIES = [
    'DE',  # Germany
    'FR',
    'ES',
    'PT',
    'IT',
    'NL',
]

调用已修补的get

>>> from modules.core import pycountry_patch
>>> pycountry_patch.currencies.get(numeric='276').name
u'Euro'

答案 2 :(得分:0)

如果您想要一个全面的解决方案来获取给定国家或地区的货币符号,则可以使用babel.numbers.get_territory_currencies

http://babel.pocoo.org/en/latest/api/numbers.html#babel.numbers.get_territory_currencies