跳转到主要内容

正确处理货币。

项目描述

正确处理货币

在大多数国际化支付系统中,金额用整数表示,而不是小数,就像在较小的货币单位(可能的最小单位)中表示的那样。

对于EUR来说,是,它是单个欧元的1/100。对于MRU来说,是库姆,它是单个乌吉亚的1/5。

货币列表是从流通货币列表维基页面使用wikitable2csv获得的单个CSV转储生成的。

PyPI Version Supported Python versions Build Status Documentation Status GPL-2.0-only OR LGPL-2.1-or-later Coverage

先决条件

  • 核心包需要Python 3.6、3.7、3.8或3.9。

  • Django集成包(valuta.contrib.django_integration)需要Django 2.2、3.0、3.1或3.2。

  • SQLAlchemy集成包(valuta.contrib.sqlalchemy_integration)与SQLAlchemy 1.4.x进行了测试。

文档

文档可在Read the Docs上找到。

安装

PyPI上的最新稳定版本

pip install valuta

或GitHub上的开发版本

pip install https://github.com/barseghyanartur/valuta/archive/master.tar.gz

用法示例

纯Python

直接使用货币类

如果您需要数字进行进一步计算
import valuta

valuta.EUR.convert_to_currency_units(1_000)
# 10.0

valuta.UGX.convert_to_currency_units(1_000)
# 1000.0

valuta.MRU.convert_to_currency_units(1_000)
# 200.0

valuta.VND.convert_to_currency_units(1_000)
# 100.0

valuta.TND.convert_to_currency_units(1_000)
# 1.0

valuta.JPY.convert_to_currency_units(1_000)
# 10.0
如果您需要显示值并返回一个漂亮的字符串
import valuta

valuta.EUR.display_in_currency_units(1_000)
# '€10.00'

valuta.UGX.display_in_currency_units(1_000)
# 'UGX1,000'

valuta.MRU.display_in_currency_units(1_000)
# 'MRU200.00'

valuta.VND.display_in_currency_units(1_000)
# '₫100'

valuta.TND.display_in_currency_units(1_000)
# 'TND1.000'

valuta.JPY.display_in_currency_units(1_000)
# '¥10'
自定义字符串格式化

根据给定货币的具体情况,显示的数字可能有或没有小数点。

display_in_currency_units方法接受可选的formatlocaledecimal_quantization参数。最常见的format值列在valuta.constants中。

格式

DISPLAY_FORMAT_NUMBER

示例值:'10000''10000.00'

DISPLAY_FORMAT_HUMAN_READABLE

显示可读性高的数字。

示例值:'10,000''10,000.00'

DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_CODE

显示带货币代码的可读性高的数字。

示例值:'JPY 10,000''EUR 10,000.00'

DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_SYMBOL

显示带货币符号的可读性高的数字。

示例值:'¥ 10,000''€ 10,000.00'

一些示例

from valuta.constants import *

valuta.JPY.display_in_currency_units(
    1_000_000,
    format=DISPLAY_FORMAT_HUMAN_READABLE
)
# '10,000'

valuta.JPY.display_in_currency_units(
    1_000_000,
    format=DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_CODE
)
# 'JPY 10,000'

valuta.JPY.display_in_currency_units(
    1_000_000,
    format=DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_SYMBOL
)
# '¥ 10,000'

valuta.EUR.display_in_currency_units(
    1_000_000,
    format=DISPLAY_FORMAT_HUMAN_READABLE
)
# '10,000.00'

valuta.EUR.display_in_currency_units(
    1_000_000,
    format=DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_CODE
)
# 'EUR 10,000.00'

valuta.EUR.display_in_currency_units(
    1_000_000,
    format=DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_SYMBOL
)
# '€ 10,000.00'
区域设置
 valuta.JPY.display_in_currency_units(1_000_000_000, locale="nl_NL")
 # 'JP¥\xa010.000.000'

 valuta.JPY.display_in_currency_units(1_000_000_000, locale="en_US")
 # '¥10,000,000'

 valuta.EUR.display_in_currency_units(1_000_000_000, locale="nl_NL")
 # '€\xa010.000.000,00'

valuta.EUR.display_in_currency_units(1_000_000_000, locale="en_US")
#  '€10,000,000.00'

valuta.AMD.display_in_currency_units(1_000_000_000, locale="en_US")
# 'AMD10,000,000.00'

valuta.AMD.display_in_currency_units(1_000_000_000, locale="hy_AM")
# '10 000 000,00 ֏'

处理(ISO-4217)货币代码的字符串表示

如果您需要数字进行进一步计算
from valuta.shortcuts import convert_to_currency_units

convert_to_currency_units("EUR", 1_000)
# 10.0

convert_to_currency_units("UGX", 1_000)
# 1000.0

convert_to_currency_units("MRU", 1_000)
# 200.0

convert_to_currency_units("VND", 1_000)
# 100.0

convert_to_currency_units("TND", 1_000)
# 1.0

convert_to_currency_units("JPY", 1_000)
# 10.0
如果您需要显示值并返回一个漂亮的字符串
from valuta.shortcuts import display_in_currency_units

display_in_currency_units("EUR", 1_000)
# '€10.00'

display_in_currency_units("UGX", 1_000)
# 'UGX1,000'

display_in_currency_units("MRU", 1_000)
# 'MRU200.00'

display_in_currency_units("VND", 1_000)
# '₫100'

display_in_currency_units("TND", 1_000)
# 'TND1.000'

display_in_currency_units("JPY", 1_000)
# '¥10'

默认情况下,由于无效的货币代码而引发的异常将被抑制(在无效的货币代码上返回None)。

如果您想在无效的货币代码上抛出异常,将fail_silently设置为False。以下示例将抛出valuta.exceptions.InvalidCurrency异常。

convert_to_currency_units("i-dont-exist", 1_000, fail_silently=False)

display_in_currency_units快捷函数也接受可选的format参数。

Django集成

在其基础上,Django集成包是一个表示货币ISO-4217代码的CurrencyField。如果绑定到某些数字字段(SmallIntegerFieldIntegerFieldBigIntegerField),这些字段包含较小货币单位中的金额,它将为模型类添加(魔法)方法,用于将字段金额转换为(主要)货币单位(通常简称为货币单位)。

还有模板标签和过滤器,当您需要在模板中渲染非模型数据(例如,JSON)而无需预先处理时使用。

模型字段

模型定义

示例模型

product/models.py

from django.db import models
from valuta.contrib.django_integration.models import CurrencyField

class Product(models.Model):

    name = models.CharField(max_length=255)
    price = models.IntegerField()  # Amount in minor currency units
    price_with_tax = models.IntegerField()  # Amount in minor currency units
    currency = CurrencyField(amount_fields=["price", "price_with_tax"])

示例数据

import valuta
from product.models import Product
product = Product.objects.create(
    name="My test product",
    price=100,
    price_with_tax=120,
    currency=valuta.AMD.uid,
)
使用魔法方法进行金额转换

然后您可以如下引用priceprice_with_tax

product.price_in_currency_units()
# 1.0
product.price_with_tax_in_currency_units()
# 1.2

注意,在amount_fields中列出的每个字段都获得一个相应的模型方法,后缀为_in_currency_units,用于将字段金额转换为(主要)货币单位。

使用魔法方法进行显示金额的转换

然后您可以如下引用priceprice_with_tax

product.price_display_in_currency_units()
# 'AMD1.00'
product.price_with_tax_display_in_currency_units()
# 'AMD1.20'

注意,在amount_fields中列出的每个字段都获得一个相应的模型方法,后缀为_display_in_currency_units,用于将字段金额转换为(主要)货币单位。

魔法方法也接受可选的format参数。

product = Product.objects.create(
    name="My test product",
    price=100_000,
    price_with_tax=120_000,
    currency=valuta.EUR.uid,
)

product.price_display_in_currency_units(
    format=DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_SYMBOL
)
# '€ 1,000.00'
product.price_with_tax_display_in_currency_units(
    format=DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_CODE
)
# 'EUR 1,200.00'

结合 格式区域 参数。

product.price_display_in_currency_units(
    format=DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_SYMBOL,
    locale="nl_NL"
)
# '€ 1.000,00'
product.price_with_tax_display_in_currency_units(
    format=DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_CODE,
    locale="nl_NL"
)
# 'EUR 1.200,00'
限制货币选择
在字段级别

您可以按以下方式限制货币选择

currency = CurrencyField(
    amount_fields=["price", "price_with_tax"],
    limit_choices_to=[valuta.AMD.uid, valuta.EUR.uid],
)
全局

您还可以在 Django 设置中覆盖 CurrencyField 的选择

settings.py

VALUTA_FIELD_LIMIT_CHOICES_TO=(
    valuta.AMD.uid,
    valuta.EUR.uid,
)
转换转换的值

如果您想显式地将结果值转换为特定类型,请为 CurrencyField 提供一个可调用的 cast_to

对于 int,将是
currency = CurrencyField(
    amount_fields=("price", "price_with_tax",),
    cast_to=int,
)
对于 float,将是
currency = CurrencyField(
    amount_fields=("price", "price_with_tax",),
    cast_to=float,
)
对于 decimal.Decimal,将是
currency = CurrencyField(
    amount_fields=("price", "price_with_tax",),
    cast_to=lambda __v: Decimal(str(__v)),
)
自定义选择显示格式

默认情况下,使用以下格式(valuta.utils.get_currency_choices_with_code

[
    ("AMD", "Armenian Dram (AMD)"),
    ("EUR", "Euro (EUR)"),
]

如果您想自定义它,请提供可调用的 get_choices_func

from valuta.utils import get_currency_choices

currency = CurrencyField(
    amount_fields=("price", "price_with_tax",),
    get_choices_func=get_currency_choices,
)

然后它将具有以下格式

[
    ("AMD", "Armenian Dram"),
    ("EUR", "Euro"),
]

以下列出了如何自定义的一个很好的例子:将 valuta.utils.get_currency_choicesvaluta.utils.get_currency_choices_with_code 作为自定义示例。例如,您可以这样做

import operator
from typing import List, Tuple, Set, Union

from babel.numbers import get_currency_symbol
from valuta.base import Registry

def get_currency_choices_with_sign(
        limit_choices_to: Union[Tuple[str, ...], List[str], Set[str]] = None,
        sort_by_key: bool = False,
) -> List[Tuple[str, str]]:
    """Get currency choices with code.

    List of choices in the following format::

        [
            ("AMD", "AMD - Armenian Dram"),
            ("EUR", "€ - Euro"),
            ("USD", "$ - US Dollar"),
        ]
    """
    if limit_choices_to is None:
        values = [
            (__key, f"{get_currency_symbol(__key)} - {__value.name}")
            for __key, __value in Registry.REGISTRY.items()
        ]
    else:
        values = [
            (__key, f"{get_currency_symbol(__key)} - {__value.name}")
            for __key, __value in Registry.REGISTRY.items()
            if __key in limit_choices_to
        ]
    if sort_by_key:
        values.sort(key=operator.itemgetter(0))
    else:
        values.sort(key=operator.itemgetter(1))
    return values

然后按照以下方式使用它

currency = CurrencyField(
    amount_fields=("price", "price_with_tax",),
    get_choices_func=get_currency_choices_with_sign,
)

模板标签和过滤器

大多数情况将由 模型字段 覆盖,但您可能会有非模型数据(例如,JSON),需要在模板中正确渲染(无需预先处理)。在这种情况下,valuta_tags 模板标签/过滤器库可能会有所帮助。

模板标签先决条件

如果您想使用 templatetags 库,需要将 valuta.contrib.django_integration 添加到您的 INSTALLED_APPS

INSTALLED_APPS = (
    # ...
    "valuta.contrib.django_integration",
    # ...
)

如果您想使用预定义的渲染格式,可能需要将 valuta.contrib.django_integration.context_processors.constants 添加到 context_processors

TEMPLATES = [{
    # ...
    "OPTIONS": {
        # ...
        "context_processors": [
            "django.template.context_processors.debug",
            "django.template.context_processors.request",
            "django.contrib.auth.context_processors.auth",
            "django.contrib.messages.context_processors.messages",
            "valuta.contrib.django_integration.context_processors.constants",
        ],
        # ...
    },
    # ...
}]
示例数据
instance = {
    "price": 1_000,
    "price_with_tax": 1_200,
    "currency_code": "EUR",
}
无格式
示例模板过滤器模板

template_filter_price_in_currency_units.html

{% load valuta_tags %}

{{ instance.price|convert_to_currency_units:instance.currency_code }}
示例模板过滤器渲染器
from django.template.loader import render_to_string

render_to_string(
    "template_filter_price_in_currency_units.html", {"instance": instance}
)
示例模板标签模板

template_tag_price_in_currency_units.html

{% load valuta_tags %}

{% convert_to_currency_units instance.price instance.currency_code %}
示例模板标签渲染器
from django.template.loader import render_to_string

render_to_string(
    "template_tag_price_in_currency_units.html", {"instance": instance}
)
有格式
示例模板过滤器模板

template_filter_price_display_in_currency_units.html

{% load valuta_tags %}

{{ instance.price|display_in_currency_units:instance.currency_code }}
示例模板过滤器渲染器
from django.template.loader import render_to_string

render_to_string(
    "template_filter_price_display_in_currency_units.html", {"instance": instance}
)
示例模板标签模板

template_tag_price_display_in_currency_units.html

{% load valuta_tags %}

{% display_in_currency_units instance.price instance.currency_code %}

您还可以以特定格式显示单位(包括货币符号)。最常见的用例已在 valuta.constants 中预定义,如果您已按照说明包含相应的上下文处理器,则可以使用它,如下所示

{% load valuta_tags %}

{% display_in_currency_units instance.price instance.currency_code DISPLAY_FORMAT_HUMAN_READABLE_WITH_CURRENCY_CODE %}

有关完整选项列表,请参阅 自定义字符串格式化

示例模板标签渲染器
from django.template.loader import render_to_string

render_to_string(
    "template_tag_price_display_in_currency_units.html", {"instance": instance}
)

SQLAlchemy 集成

与 Django 集成包类似,SQLAlchemy 集成包是一个简单的 CurrencyType,表示货币的 ISO-4217 代码。

尚未实现任何魔术方法(尽管计划实现)。您得到的是一个简单的 SQLAlchemy 类型来存储数据。对于其余部分,您必须使用 valuta.shortcuts

请参阅 sqlalchemy-integration/examples/sqlalchemy_example/valuta_admin/models.py <https://github.com/barseghyanartur/valuta/blob/feature/sqlalchemy-integration/examples/sqlalchemy_example/valuta_admin/models.py#L50> 作为良好的示例。

模型定义

示例模型

product/models.py

from valuta.contrib.sqlalchemy_integration.types import CurrencyType
from . import db  # Standard SQLAlchemy way

class Product(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64), unique=True)
    price = db.Column(db.Integer())
    price_with_tax = db.Column(db.Integer())
    currency = db.Column(CurrencyType())

示例数据

import valuta
from product.models import Product
product = Product(
    name="My test product",
    price=100,
    price_with_tax=120,
    currency=valuta.AMD.uid,
)

支持的货币

带有 (*) 标记的货币是自定义的(手动添加)。其余的是从已提到的 流通货币列表 中获得的。

┌───────────┬──────────────────────────────────────────┐
│ ISO code  │ Currency                                 │
├───────────┼──────────────────────────────────────────┤
│ AED       │ United Arab Emirates Dirham              │
├───────────┼──────────────────────────────────────────┤
│ AFN       │ Afghan Afghani                           │
├───────────┼──────────────────────────────────────────┤
│ ALL       │ Albanian Lek                             │
├───────────┼──────────────────────────────────────────┤
│ AMD       │ Armenian Dram                            │
├───────────┼──────────────────────────────────────────┤
│ ANG       │ Netherlands Antillean Guilder            │
├───────────┼──────────────────────────────────────────┤
│ AOA       │ Angolan Kwanza                           │
├───────────┼──────────────────────────────────────────┤
│ ARS       │ Argentine Peso                           │
├───────────┼──────────────────────────────────────────┤
│ AUD       │ Australian Dollar                        │
├───────────┼──────────────────────────────────────────┤
│ AWG       │ Aruban Florin                            │
├───────────┼──────────────────────────────────────────┤
│ AZN       │ Azerbaijani Manat                        │
├───────────┼──────────────────────────────────────────┤
│ BAM       │ Bosnia-Herzegovina Convertible Mark      │
├───────────┼──────────────────────────────────────────┤
│ BBD       │ Barbadian Dollar                         │
├───────────┼──────────────────────────────────────────┤
│ BDT       │ Bangladeshi Taka                         │
├───────────┼──────────────────────────────────────────┤
│ BGN       │ Bulgarian Lev                            │
├───────────┼──────────────────────────────────────────┤
│ BHD       │ Bahraini Dinar                           │
├───────────┼──────────────────────────────────────────┤
│ BIF       │ Burundian Franc                          │
├───────────┼──────────────────────────────────────────┤
│ BMD       │ Bermudan Dollar                          │
├───────────┼──────────────────────────────────────────┤
│ BND       │ Brunei Dollar                            │
├───────────┼──────────────────────────────────────────┤
│ BOB       │ Bolivian Boliviano                       │
├───────────┼──────────────────────────────────────────┤
│ BRL       │ Brazilian Real                           │
├───────────┼──────────────────────────────────────────┤
│ BSD       │ Bahamian Dollar                          │
├───────────┼──────────────────────────────────────────┤
│ BTC       │ Bitcoin (*)                              │
├───────────┼──────────────────────────────────────────┤
│ BTN       │ Bhutanese Ngultrum                       │
├───────────┼──────────────────────────────────────────┤
│ BWP       │ Botswanan Pula                           │
├───────────┼──────────────────────────────────────────┤
│ BYN       │ Belarusian Ruble                         │
├───────────┼──────────────────────────────────────────┤
│ BZD       │ Belize Dollar                            │
├───────────┼──────────────────────────────────────────┤
│ CAD       │ Canadian Dollar                          │
├───────────┼──────────────────────────────────────────┤
│ CDF       │ Congolese Franc                          │
├───────────┼──────────────────────────────────────────┤
│ CHF       │ Swiss Franc                              │
├───────────┼──────────────────────────────────────────┤
│ CKD       │ CKD                                      │
├───────────┼──────────────────────────────────────────┤
│ CLP       │ Chilean Peso                             │
├───────────┼──────────────────────────────────────────┤
│ CNY       │ Chinese Yuan                             │
├───────────┼──────────────────────────────────────────┤
│ COP       │ Colombian Peso                           │
├───────────┼──────────────────────────────────────────┤
│ CRC       │ Costa Rican Colón                        │
├───────────┼──────────────────────────────────────────┤
│ CUP       │ Cuban Peso                               │
├───────────┼──────────────────────────────────────────┤
│ CVE       │ Cape Verdean Escudo                      │
├───────────┼──────────────────────────────────────────┤
│ CZK       │ Czech Koruna                             │
├───────────┼──────────────────────────────────────────┤
│ DJF       │ Djiboutian Franc                         │
├───────────┼──────────────────────────────────────────┤
│ DKK       │ Danish Krone                             │
├───────────┼──────────────────────────────────────────┤
│ DOP       │ Dominican Peso                           │
├───────────┼──────────────────────────────────────────┤
│ DZD       │ Algerian Dinar                           │
├───────────┼──────────────────────────────────────────┤
│ EGP       │ Egyptian Pound                           │
├───────────┼──────────────────────────────────────────┤
│ ERN       │ Eritrean Nakfa                           │
├───────────┼──────────────────────────────────────────┤
│ ETB       │ Ethiopian Birr                           │
├───────────┼──────────────────────────────────────────┤
│ EUR       │ Euro                                     │
├───────────┼──────────────────────────────────────────┤
│ FJD       │ Fijian Dollar                            │
├───────────┼──────────────────────────────────────────┤
│ FKP       │ Falkland Islands Pound                   │
├───────────┼──────────────────────────────────────────┤
│ FOK       │ FOK                                      │
├───────────┼──────────────────────────────────────────┤
│ GBP       │ British Pound                            │
├───────────┼──────────────────────────────────────────┤
│ GEL       │ Georgian Lari                            │
├───────────┼──────────────────────────────────────────┤
│ GGP       │ GGP                                      │
├───────────┼──────────────────────────────────────────┤
│ GHS       │ Ghanaian Cedi                            │
├───────────┼──────────────────────────────────────────┤
│ GIP       │ Gibraltar Pound                          │
├───────────┼──────────────────────────────────────────┤
│ GMD       │ Gambian Dalasi                           │
├───────────┼──────────────────────────────────────────┤
│ GNF       │ Guinean Franc                            │
├───────────┼──────────────────────────────────────────┤
│ GTQ       │ Guatemalan Quetzal                       │
├───────────┼──────────────────────────────────────────┤
│ GYD       │ Guyanaese Dollar                         │
├───────────┼──────────────────────────────────────────┤
│ HKD       │ Hong Kong Dollar                         │
├───────────┼──────────────────────────────────────────┤
│ HNL       │ Honduran Lempira                         │
├───────────┼──────────────────────────────────────────┤
│ HRK       │ Croatian Kuna                            │
├───────────┼──────────────────────────────────────────┤
│ HTG       │ Haitian Gourde                           │
├───────────┼──────────────────────────────────────────┤
│ HUF       │ Hungarian Forint                         │
├───────────┼──────────────────────────────────────────┤
│ IDR       │ Indonesian Rupiah                        │
├───────────┼──────────────────────────────────────────┤
│ ILS       │ Israeli New Shekel                       │
├───────────┼──────────────────────────────────────────┤
│ IMP       │ IMP                                      │
├───────────┼──────────────────────────────────────────┤
│ INR       │ Indian Rupee                             │
├───────────┼──────────────────────────────────────────┤
│ IQD       │ Iraqi Dinar                              │
├───────────┼──────────────────────────────────────────┤
│ IRR       │ Iranian Rial                             │
├───────────┼──────────────────────────────────────────┤
│ ISK       │ Icelandic Króna                          │
├───────────┼──────────────────────────────────────────┤
│ JEP       │ JEP                                      │
├───────────┼──────────────────────────────────────────┤
│ JMD       │ Jamaican Dollar                          │
├───────────┼──────────────────────────────────────────┤
│ JOD       │ Jordanian Dinar                          │
├───────────┼──────────────────────────────────────────┤
│ JPY       │ Japanese Yen                             │
├───────────┼──────────────────────────────────────────┤
│ KES       │ Kenyan Shilling                          │
├───────────┼──────────────────────────────────────────┤
│ KGS       │ Kyrgystani Som                           │
├───────────┼──────────────────────────────────────────┤
│ KHR       │ Cambodian Riel                           │
├───────────┼──────────────────────────────────────────┤
│ KID       │ KID                                      │
├───────────┼──────────────────────────────────────────┤
│ KMF       │ Comorian Franc                           │
├───────────┼──────────────────────────────────────────┤
│ KPW       │ North Korean Won                         │
├───────────┼──────────────────────────────────────────┤
│ KRW       │ South Korean Won                         │
├───────────┼──────────────────────────────────────────┤
│ KWD       │ Kuwaiti Dinar                            │
├───────────┼──────────────────────────────────────────┤
│ KYD       │ Cayman Islands Dollar                    │
├───────────┼──────────────────────────────────────────┤
│ KZT       │ Kazakhstani Tenge                        │
├───────────┼──────────────────────────────────────────┤
│ LAK       │ Laotian Kip                              │
├───────────┼──────────────────────────────────────────┤
│ LBP       │ Lebanese Pound                           │
├───────────┼──────────────────────────────────────────┤
│ LKR       │ Sri Lankan Rupee                         │
├───────────┼──────────────────────────────────────────┤
│ LRD       │ Liberian Dollar                          │
├───────────┼──────────────────────────────────────────┤
│ LSL       │ Lesotho Loti                             │
├───────────┼──────────────────────────────────────────┤
│ LYD       │ Libyan Dinar                             │
├───────────┼──────────────────────────────────────────┤
│ MAD       │ Moroccan Dirham                          │
├───────────┼──────────────────────────────────────────┤
│ MDL       │ Moldovan Leu                             │
├───────────┼──────────────────────────────────────────┤
│ MGA       │ Malagasy Ariary                          │
├───────────┼──────────────────────────────────────────┤
│ MKD       │ Macedonian Denar                         │
├───────────┼──────────────────────────────────────────┤
│ MMK       │ Myanmar Kyat                             │
├───────────┼──────────────────────────────────────────┤
│ MNT       │ Mongolian Tugrik                         │
├───────────┼──────────────────────────────────────────┤
│ MOP       │ Macanese Pataca                          │
├───────────┼──────────────────────────────────────────┤
│ MRU       │ Mauritanian Ouguiya                      │
├───────────┼──────────────────────────────────────────┤
│ MUR       │ Mauritian Rupee                          │
├───────────┼──────────────────────────────────────────┤
│ MVR       │ Maldivian Rufiyaa                        │
├───────────┼──────────────────────────────────────────┤
│ MWK       │ Malawian Kwacha                          │
├───────────┼──────────────────────────────────────────┤
│ MXN       │ Mexican Peso                             │
├───────────┼──────────────────────────────────────────┤
│ MYR       │ Malaysian Ringgit                        │
├───────────┼──────────────────────────────────────────┤
│ MZN       │ Mozambican Metical                       │
├───────────┼──────────────────────────────────────────┤
│ NAD       │ Namibian Dollar                          │
├───────────┼──────────────────────────────────────────┤
│ NGN       │ Nigerian Naira                           │
├───────────┼──────────────────────────────────────────┤
│ NIO       │ Nicaraguan Córdoba                       │
├───────────┼──────────────────────────────────────────┤
│ NOK       │ Norwegian Krone                          │
├───────────┼──────────────────────────────────────────┤
│ NPR       │ Nepalese Rupee                           │
├───────────┼──────────────────────────────────────────┤
│ NZD       │ New Zealand Dollar                       │
├───────────┼──────────────────────────────────────────┤
│ OMR       │ Omani Rial                               │
├───────────┼──────────────────────────────────────────┤
│ PAB       │ Panamanian Balboa                        │
├───────────┼──────────────────────────────────────────┤
│ PEN       │ Peruvian Sol                             │
├───────────┼──────────────────────────────────────────┤
│ PGK       │ Papua New Guinean Kina                   │
├───────────┼──────────────────────────────────────────┤
│ PHP       │ Philippine Piso                          │
├───────────┼──────────────────────────────────────────┤
│ PKR       │ Pakistani Rupee                          │
├───────────┼──────────────────────────────────────────┤
│ PLN       │ Polish Zloty                             │
├───────────┼──────────────────────────────────────────┤
│ PND       │ PND                                      │
├───────────┼──────────────────────────────────────────┤
│ PRB       │ PRB                                      │
├───────────┼──────────────────────────────────────────┤
│ PYG       │ Paraguayan Guarani                       │
├───────────┼──────────────────────────────────────────┤
│ QAR       │ Qatari Rial                              │
├───────────┼──────────────────────────────────────────┤
│ RON       │ Romanian Leu                             │
├───────────┼──────────────────────────────────────────┤
│ RSD       │ Serbian Dinar                            │
├───────────┼──────────────────────────────────────────┤
│ RUB       │ Russian Ruble                            │
├───────────┼──────────────────────────────────────────┤
│ RWF       │ Rwandan Franc                            │
├───────────┼──────────────────────────────────────────┤
│ SAR       │ Saudi Riyal                              │
├───────────┼──────────────────────────────────────────┤
│ SBD       │ Solomon Islands Dollar                   │
├───────────┼──────────────────────────────────────────┤
│ SCR       │ Seychellois Rupee                        │
├───────────┼──────────────────────────────────────────┤
│ SDG       │ Sudanese Pound                           │
├───────────┼──────────────────────────────────────────┤
│ SEK       │ Swedish Krona                            │
├───────────┼──────────────────────────────────────────┤
│ SGD       │ Singapore Dollar                         │
├───────────┼──────────────────────────────────────────┤
│ SHP       │ St. Helena Pound                         │
├───────────┼──────────────────────────────────────────┤
│ SLL       │ Sierra Leonean Leone                     │
├───────────┼──────────────────────────────────────────┤
│ SLS       │ SLS                                      │
├───────────┼──────────────────────────────────────────┤
│ SOS       │ Somali Shilling                          │
├───────────┼──────────────────────────────────────────┤
│ SRD       │ Surinamese Dollar                        │
├───────────┼──────────────────────────────────────────┤
│ SSP       │ South Sudanese Pound                     │
├───────────┼──────────────────────────────────────────┤
│ STN       │ São Tomé & Príncipe Dobra                │
├───────────┼──────────────────────────────────────────┤
│ SYP       │ Syrian Pound                             │
├───────────┼──────────────────────────────────────────┤
│ SZL       │ Swazi Lilangeni                          │
├───────────┼──────────────────────────────────────────┤
│ THB       │ Thai Baht                                │
├───────────┼──────────────────────────────────────────┤
│ TJS       │ Tajikistani Somoni                       │
├───────────┼──────────────────────────────────────────┤
│ TMT       │ Turkmenistani Manat                      │
├───────────┼──────────────────────────────────────────┤
│ TND       │ Tunisian Dinar                           │
├───────────┼──────────────────────────────────────────┤
│ TOP       │ Tongan Paʻanga                           │
├───────────┼──────────────────────────────────────────┤
│ TRY       │ Turkish Lira                             │
├───────────┼──────────────────────────────────────────┤
│ TTD       │ Trinidad & Tobago Dollar                 │
├───────────┼──────────────────────────────────────────┤
│ TVD       │ TVD                                      │
├───────────┼──────────────────────────────────────────┤
│ TWD       │ New Taiwan Dollar                        │
├───────────┼──────────────────────────────────────────┤
│ TZS       │ Tanzanian Shilling                       │
├───────────┼──────────────────────────────────────────┤
│ UAH       │ Ukrainian Hryvnia                        │
├───────────┼──────────────────────────────────────────┤
│ UGX       │ Ugandan Shilling                         │
├───────────┼──────────────────────────────────────────┤
│ USD       │ US Dollar                                │
├───────────┼──────────────────────────────────────────┤
│ UYU       │ Uruguayan Peso                           │
├───────────┼──────────────────────────────────────────┤
│ UZS       │ Uzbekistani Som                          │
├───────────┼──────────────────────────────────────────┤
│ VES       │ Venezuelan Bolívar                       │
├───────────┼──────────────────────────────────────────┤
│ VND       │ Vietnamese Dong                          │
├───────────┼──────────────────────────────────────────┤
│ VUV       │ Vanuatu Vatu                             │
├───────────┼──────────────────────────────────────────┤
│ WST       │ Samoan Tala                              │
├───────────┼──────────────────────────────────────────┤
│ XAF       │ Central African CFA Franc                │
├───────────┼──────────────────────────────────────────┤
│ XCD       │ East Caribbean Dollar                    │
├───────────┼──────────────────────────────────────────┤
│ XOF       │ West African CFA Franc                   │
├───────────┼──────────────────────────────────────────┤
│ XPF       │ CFP Franc                                │
├───────────┼──────────────────────────────────────────┤
│ YER       │ Yemeni Rial                              │
├───────────┼──────────────────────────────────────────┤
│ ZAR       │ South African Rand                       │
├───────────┼──────────────────────────────────────────┤
│ ZMW       │ Zambian Kwacha                           │
├───────────┼──────────────────────────────────────────┤
│ ZWB       │ ZWB                                      │
└───────────┴──────────────────────────────────────────┘

在终端中运行以下命令以列出所有可用货币

valuta-list-currencies

自定义货币

要注册新的自定义货币,请按照以下操作进行

from valuta.base import BaseCurrency

class XYZ(BaseCurrency):
    """XYZ - The XYZ currency."""

    uid: str = "XYZ"
    rate: int = 100_000_000

从 CSV 导出中生成货币

如果 流通货币列表 有更新,以相同的方式获取它,将其保存为 list_of_circulating_currencies.csv 在源中,然后运行以下命令

valuta-generate-currencies --skip-first-line

测试

简单输入

pytest -vvv

或使用tox

tox

或使用tox检查特定环境

tox -e py39-django32

编写文档

保持以下层次结构。

=====
title
=====

header
======

sub-header
----------

sub-sub-header
~~~~~~~~~~~~~~

sub-sub-sub-header
^^^^^^^^^^^^^^^^^^

sub-sub-sub-sub-header
++++++++++++++++++++++

sub-sub-sub-sub-sub-header
**************************

许可证

GPL-2.0-only OR LGPL-2.1-or-later

支持

对于任何问题,请通过作者部分提供的电子邮件联系我。

作者

Artur Barseghyan <artur.barseghyan@gmail.com>

项目详情


下载文件

下载适合您平台文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码发行版

valuta-0.3.2.tar.gz (75.0 kB 查看哈希值)

上传时间 源代码

构建发行版

valuta-0.3.2-py2.py3-none-any.whl (112.3 kB 查看哈希值)

上传时间 Python 2 Python 3

支持单位: