A better idea is to store money in minor currency units (smallest units possible). For euros and dollars the minor currency units are cents. There's a Python (and Django) package called valuta based on the concept.
Using currency classes directly
import valuta
valuta.EUR.convert_to_currency_units(1_000) # 1_000 is the price in cents
# 10.0
Working with string representations of the (ISO-4217) currency codes
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 integration
Model definition
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"])
Sample data
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,
)
Use magic methods to convert from minor currency (cents) units to major currency units (euros)
product.price_in_currency_units() # Price in euros
# 10.0
product.price_with_tax_in_currency_units() # Price in euros
# 12.0
If you need to display it in templates:
product.price_display_in_currency_units() # Price in euros
# '10.00'
product.price_with_tax_display_in_currency_units() # Price in euros
# '12.00'
Now try another currency (JPY).
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'