Получить наименьшую единицу валюты в python

поставщику кредитной карты требуется сумма транзакции в центах или наименьшая доступная единица валюты. так как я хочу, чтобы код был переносимым, мне нужно получить наименьшую единицу данной валюты, и это зависит от основного устройства. Я попытался получить его из локального модуля, но мне не повезло.

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

Пример

У меня есть код валюты, как описано в iso 4217

EUR за евро

тогда мне нужно 1 евро - 100 евроцентов (только информация 1/100, текст не нужен)

согласно wikipedia там валюты, которые имеют более 2 единиц, таких как старый фунт стерлингов

Ответ 1

В качестве альтернативы cou может использовать следующий простой модуль отображения: 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

Ответ 2

Вы можете посмотреть python-money или ccy.

Ответ 3

Насколько я знаю, нет выходного модуля, который предоставит вам эту информацию. Однако все данные, которые вам нужны, перечислены здесь: http://en.wikipedia.org/wiki/List_of_circulating_currencies

Вам, вероятно, потребуется сохранить свой собственный список (используя страницу wikipedia в качестве исходного источника). Тогда было бы разумно прямо сделать свое собственное сопоставление.

Чтобы начать, вот быстрый хак. Вставка и запуск следующего script в вашем браузере. Консоль Javascript, находясь на этой странице wikipedia, проанализирует содержимое и добавит на страницу удобную для 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"));

Здесь пример вывода (script выполняется с использованием Firebug):

Здесь вывод: https://gist.github.com/16d43be2652a06cf962d

Ответ 4

Локальный модуль 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 '

Но если вам нужно обрабатывать каждую валюту, как сказал другой, вам придется самим создать/сохранить свой стол.

Ответ 5

Я не знаю, существует ли он для 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>

Ответ 6

Начиная с нескольких лет, существует iso4217 package. Он предоставляет показатель десятичной точки ISO/base-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 также делает это.