3

我有一个 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(德国数字)的货币 - 但它确实包含欧元。关于如何解决这个问题的任何想法?

4

3 回答 3

4

不幸的是,国家数字代码与货币数字不同。根据 ISO 的说法,“在可能的情况下,3 位数字代码与数字国家代码相同”——但这对于由多个国家共享的欧元显然是不可能的。

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

于 2014-05-05T04:20:55.060 回答
1

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

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

于 2020-02-06T14:40:12.843 回答
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',
]

调用 patched get

>>> from modules.core import pycountry_patch
>>> pycountry_patch.currencies.get(numeric='276').name
u'Euro'
于 2016-05-12T21:18:30.463 回答