更好的办法是以次要货币单位(可能的最小单位)存储资金。对于欧元和美元,次要货币单位是美分。基于这个概念,有一个名为 valuta 的 Python(和 Django)包。
直接使用货币类别
import valuta
valuta.EUR.convert_to_currency_units(1_000) # 1_000 is the price in cents
# 10.0
使用 (ISO-4217) 货币代码的字符串表示形式
from valuta.shortcuts import convert_to_currency_units
convert_to_currency_units("EUR", 1_000) # 1_000 is the price in cents
# 10.0
Django 集成
模型定义
from django.db import models
from valuta.contrib.django_integration.models import CurrencyField
class Product(models.Model):
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(
price=1_000, # Price in cents
price_with_tax=1_200, # Price in cents
currency=valuta.EUR.uid,
)
使用魔术方法将次要货币(美分)单位转换为主要货币单位(欧元)
product.price_in_currency_units() # Price in euros
# 10.0
product.price_with_tax_in_currency_units() # Price in euros
# 12.0
如果需要在模板中显示:
product.price_display_in_currency_units() # Price in euros
# '10.00'
product.price_with_tax_display_in_currency_units() # Price in euros
# '12.00'
现在试试另一种货币(日元)。
product_jpy = Product.objects.create(
price=1_000, # Price in cents
price_with_tax=1_200, # Price in cents
currency=valuta.JPY.uid,
)
product.price_in_currency_units() # Price in JPY
# 10.0
product.price_with_tax_in_currency_units() # Price in JPY
# 12.0
product.price_display_in_currency_units() # Price in JPY
# '10'
product.price_with_tax_display_in_currency_units() # Price in JPY
# '12'