用于表示美元金额的最佳 django 模型字段是啥?
Posted
技术标签:
【中文标题】用于表示美元金额的最佳 django 模型字段是啥?【英文标题】:What is the best django model field to use to represent a US dollar amount?用于表示美元金额的最佳 django 模型字段是什么? 【发布时间】:2010-11-11 11:35:12 【问题描述】:我需要在 Django 模型的字段中存储美元金额。最好使用的模型字段类型是什么?我需要能够让用户输入这个值(通过错误检查,只想要一个精确到美分的数字),格式化它以输出给不同地方的用户,并用它来计算其他数字。
【问题讨论】:
【参考方案1】:decimal field 是 货币价值。
它看起来像:
credit = models.DecimalField(max_digits=6, decimal_places=2)
【讨论】:
除非你想代表国债,在这种情况下 max_digits 必须> 20 decimal_places=2 如果您需要它来支持其他货币,则不一定正确。一些货币的小数点后三位,而比特币则高达 8 位。 我认为这个例子几乎适用于所有货币。要将货币表示为比特币,我认为最好使用整数字段将金额保存为 satoshis,然后以您想要的表示形式(BTC、mBTC 等)显示给最终用户 @LieRyan 这是真的。我们必须注意现代类型的“货币”,以防止将来对数据库进行任何修改。使用引号没有任何冒犯。 这个答案***.com/questions/224462/… 建议使用max_digits=19, decimal_place=4
是安全的。【参考方案2】:
其他答案 100% 正确,但不是很实用,因为您仍然需要手动管理输出、格式等。
我建议使用django-money:
from djmoney.models.fields import MoneyField
from django.db import models
def SomeModel(models.Model):
some_currency = MoneyField(
decimal_places=2,
default=0,
default_currency='USD',
max_digits=11,
)
从模板自动工作:
somemodel.some_currency
输出:
$123.00
它通过 python-money 拥有强大的后端,它本质上是标准十进制字段的直接替代品。
【讨论】:
(带错误检查,只需要精确到美分的数字),格式化输出给不同地方的用户,用它来计算其他数字。 ,使用DecimalField
更实用。我相信它适用于大多数人。正如他们强调的那样,使用django-money
,包括货币处理。所以这更适用于涉及交易的项目,如电子商务网站、支付网关、数字货币、银行等......
我认为,由于他们使用的是美元——一种货币——使用像 django-money (python-money) 这样的货币处理库更有意义,因为它可以完成一切按照您的预期工作,并提供未来的功能调整。最初的问题说他们需要格式化和计算(正如你所引用的那样),为此你最好使用货币库而不是简单的十进制字段。
如果我想添加两个货币字段或做一些计算怎么办?
@saran3h 您可以使用货币实例并像任何其他数字(十进制)实例一样执行计算。您可以加/减,乘以整数等。【参考方案3】:
field = models.DecimalField(max_digits=8, decimal_places=2)
请注意,max_digits 应该 >= decimal_places。此示例设置允许的值最大为:999,999.99
文档:https://docs.djangoproject.com/en/1.10/ref/models/fields/#decimalfield
【讨论】:
【参考方案4】:定义一个小数并在值前返回一个 $ 符号。
price = models.DecimalField(max_digits=8, decimal_places=2)
@property
def price_display(self):
return "$%s" % self.price
【讨论】:
你确实意识到你刚刚在你的属性中创建了一个无限递归循环,对吧? 有趣。请问那是怎么回事?【参考方案5】:field = models.DecimalField(max_digits=8, decimal_places=2)
应该为 PostgreSQL 创建一个字段,例如:
"field" numeric(8, 2) NOT NULL
PostGreSQL 存储美元金额的最佳方式是什么。
如果你需要一个 PostgreSQL 字段类型“双精度”,那么你需要在 django 模型中做:
field = models.FloatField()
【讨论】:
谨防将货币表示为浮点数,因为人们往往会对 w.r.t 的舍入错误感到不满。他们的钱。请参阅:***.com/questions/3730019/… 了解更多详情。以上是关于用于表示美元金额的最佳 django 模型字段是啥?的主要内容,如果未能解决你的问题,请参考以下文章
将货币金额四舍五入到最接近的镍、四分之一、1 美元、5 美元等面额的最佳方法是啥?
在 Django 中使用更多字段扩展用户模型的最佳方法是啥?