信用卡提供商需要以美分或最小可用货币单位为单位的交易金额。因为我希望代码是可移植的,所以我必须获得给定货币的最小单位,并且它是主要单位的因素。我试图从语言环境模块中获取它,但我没有运气。
http://docs.python.org/library/locale.html
例子
我有一个ISO 4217中描述的货币代码
EUR 对欧元
那么我需要 1 欧元是 100 欧分(只有信息 1/100,不需要文字)
根据维基百科,有超过 2 个单位的货币,如旧庞德英镑
信用卡提供商需要以美分或最小可用货币单位为单位的交易金额。因为我希望代码是可移植的,所以我必须获得给定货币的最小单位,并且它是主要单位的因素。我试图从语言环境模块中获取它,但我没有运气。
http://docs.python.org/library/locale.html
例子
我有一个ISO 4217中描述的货币代码
EUR 对欧元
那么我需要 1 欧元是 100 欧分(只有信息 1/100,不需要文字)
根据维基百科,有超过 2 个单位的货币,如旧庞德英镑
或者,可以使用以下简单的映射模块: http: //pastebin.com/K7kVXi8P
将此 pastebin 保存到项目中的模块中(例如 simple_currency_helper.py)并使用映射(或辅助方法get_currency_subunit
)获取给定 ISO 代码的货币子单元。
>>> from simple_currency_helper import get_currency_subunit
>>> print get_currency_subunit('TND')
1000
您可以查看python-money或ccy模块。
据我所知,没有一个现有的模块可以为您提供该信息。但是,您需要的所有数据似乎都列在这里:http ://en.wikipedia.org/wiki/List_of_circulating_currencies
您可能需要维护自己的列表(使用维基百科页面作为初始来源)。然后,进行自己的映射将是相当直接的。
为了让你开始,这里有一个快速的技巧。在该维基百科页面上,在浏览器的 Javascript 控制台中粘贴并运行以下脚本将解析内容并将数据的 python 友好版本附加到页面:
var out = "data = {\n";
$("table.wikitable").find("tr").each(function(idx) {
if (idx == 0) return; // Skip first line.
var last3 = $(this).find("td").slice(-3);
var code = $(last3[0]).text();
if (code != "None") {
var scale = $(last3[2]).text().replace(",","");
if (scale != "None") {
var minor_name = $(last3[1]).text().split("[")[0];
out += ' "' + code + '": ("' + minor_name + '", ' + scale + '),' + "\n";
}
}
});
out += "}";
$("<pre>").text(out).appendTo($("body"));
这是一个示例输出(使用 Firebug 运行的脚本):
python 的语言环境模块可以为您提供这些信息,但仅限于您正在使用的语言环境的货币,不幸的是它不是多币种。
locale.localconv()可以为您提供当前语言环境的信息(位数是'int_frac_digits'
成员)。例如,如果您使用 en_US 进行本地化,您可以这样做:
locale.setlocale(locale.LC_MONETARY, "en_US") # set the en_US locale
locale.localeconv()['int_frac_digits']
>>> 2
locale.localeconv()['int_curr_symbol']
>>> 'USD '
但是,如果您需要处理每种货币,正如另一个人所说,您必须自己制作/维护您的桌子。
我不知道它是否适用于python。我们曾经使用这个xml。
<item code="USD" symbol="$" sort="20" iso="840">
<name lang="en">
<singular>
<nominative>US dollar</nominative>
<genitive>US dollar</genitive>
<dative>US dollar</dative>
<full>US dollar</full>
<prepos>US dollar</prepos>
</singular>
<plural>
<nominative>US dollars</nominative>
<genitive>US dollars</genitive>
<dative>US dollars</dative>
<full>US dollars</full>
<prepos>US dollars</prepos>
</plural>
</name>
<frac lang="en">100 cents</frac>
<bank href="http://www.federalreserve.gov/">
<name lang="en">
<nominative>The U.S. Federal Reserve System</nominative>
<genitive>The U.S. Federal Reserve System</genitive>
</name>
</bank>
<synonim lang="en">
<item>buck</item>
<item>green buck</item>
</synonim>
<banknotes/>
</item>
几年以来,就有了iso4217 包。它为每个主要货币单位的次要货币单位数提供 ISO 小数点/以 10 为底的指数:
>>> import iso4217
>>> iso4217.Currency(u'EUR').exponent
2
您可以使用它直接在小额货币和大额货币之间进行转换:
def to_small_currency(large_currency_amount, iso_code):
exponent = iso4217.Currency(iso_code).exponent
if exponent == 0: # 0 signals unused/nonexistent minor currency
return large_currency_amount
return large_currency_amount * (10 ** exponent)
请注意,有一些货币不使用 base-10 作为其次要货币。目前,这些是MRU
和MGA
。ISO 4217 仍然用指数 1 表示它们,并且iso4217
包也是如此。