我有一个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(德国数字)的货币 - 但它确实包含欧元。关于这可能是什么方式的任何想法?
答案 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