10

信用卡提供商需要以美分或最小可用货币单位为单位的交易金额。因为我希望代码是可移植的,所以我必须获得给定货币的最小单位,并且它是主要单位的因素。我试图从语言环境模块中获取它,但我没有运气。

http://docs.python.org/library/locale.html

例子

我有一个ISO 4217中描述的货币代码

EUR 对欧元

那么我需要 1 欧元是 100 欧分(只有信息 1/100,不需要文字)

根据维基百科,有超过 2 个单位的货币,如旧庞德英镑

4

6 回答 6

5

或者,可以使用以下简单的映射模块: 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
于 2012-09-04T15:55:00.950 回答
1

您可以查看python-moneyccy模块。

于 2012-09-04T14:30:32.287 回答
1

据我所知,没有一个现有的模块可以为您提供该信息。但是,您需要的所有数据似乎都列在这里: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 运行的脚本):

这是输出:https ://gist.github.com/16d43be2652a06cf962d

于 2012-09-04T15:04:24.567 回答
1

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 '

但是,如果您需要处理每种货币,正如另一个人所说,您必须自己制作/维护您的桌子。

于 2012-09-04T15:09:28.950 回答
0

我不知道它是否适用于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>
于 2012-09-04T14:56:14.783 回答
0

几年以来,就有了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 作为其次要货币。目前,这些是MRUMGA。ISO 4217 仍然用指数 1 表示它们,并且iso4217包也是如此。

于 2018-02-06T14:40:59.440 回答