Django normalize()显示1E+1

wljmcqd8  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(135)

我试图在模型中创建一个函数来显示产品信息,在我的模型中,我有以下内容:

class Product(models.Model):
    price = models.DecimalField(max_digits=10, decimal_places=2)

    @property
    def product_label(self):
    return f'The product price is {self.price.normalize()}'

如果价格是10.50,使用normalize()可以很好地工作,输出如下,这正是我想要的:

The product price is 10.05

但是,当我的价格为10.00时,显示的输出显示1E+1而不是10

The product price is 1E+1

有什么办法可以解决这个问题吗?

wlp8pajw

wlp8pajw1#

解决方案

你可以用这种方法来修复它:

@property
def product_label(self):
    return f'The product price is {self.price.normalize():f}'

只需在方法调用后添加:f,即可将Decimal对象格式化为定点数。

说明

来自文档:

normalize(context=None)

通过删除最右边的尾随零并将等于Decimal('0')的任何结果转换为Decimal('0e0'),来规范数字。用于为等价类的属性生成规范值。例如,Decimal('32.100')Decimal('0.321000e+2')都归一化为等效值Decimal('32.1')
因此,它不一定要转换为人类可读的值。
在FAQ部分,您可以看到以下提供的一些解决方案:
如果一个应用程序不关心跟踪的重要性,很容易删除指数和尾随零,失去重要性,但保持值不变:

>>> from decimal import Decimal
>>> def remove_exponent(d):
...     return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize()
>>> remove_exponent(Decimal('5E+3'))
Decimal('5000')

但在您的示例中,设置值的格式就足够了。

参考

格式说明符

https://peps.python.org/pep-3101/#standard-format-specifiers

十进制常见问题解答

https://docs.python.org/3/library/decimal.html#decimal-faq

相关问题