abs()的操作数类型错误:Django中的“str”

ubof19bj  于 2022-12-30  发布在  Go
关注(0)|答案(6)|浏览(136)

我正在通过开始django电子商务应用程序的购物车应用程序。我得到的错误如上所述,而点击添加到购物车按钮。
{{ cart_sutotal|currency}}行出现错误

kmpatx3s

kmpatx3s1#

我记得那本书......你在做一个自定义模板过滤器对吧?你需要把传入locale.currency的值从字符串转换成int/decimal/float
避免货币舍入错误的最佳做法是使用decimal程序包。导入decimal程序包并通过Decimal函数传递值以解决此问题。

from decimal import Decimal
    value = Decimal(value)

因此,您的代码应该如下所示:

from django import template

    import locale
    from decimal import Decimal

    register = template.Library()    
    
    @register.filter(name='currency')    
    def currency(value):    
        try:    
            locale.setlocale(locale.LC_ALL,'en_US.UTF-8')    
        except:    
            locale.setlocale(locale.LC_ALL,'')    
        value = Decimal(value)    
        loc = locale.localeconv()    
        return locale.currency(value, loc['currency_symbol'], grouping=True)
3bygqnnd

3bygqnnd2#

从Python文档中。

    • 绝对值()**
  • 返回数字的绝对值。参数可以是普通整数、长整数或浮点数。如果参数是复数,则返回其大小。*

出现的错误表明您正在将str参数传递给abs()方法,因为它需要选择上述参数。解决方案是将integer对象显式传递给abs方法。

示例:

>>>number = "1"
>>>print abs(int(number))
1
>>>
lztngnrs

lztngnrs3#

currency筛选器要求其参数为数值;你传递给模板的字符串是cart_sutotal
在将它传递给模板之前,先将它转换成十进制,十进制,或者更好的是,弄清楚为什么要将价格值相加,并得出一个字符串作为小计。

yx2lnoni

yx2lnoni4#

您的代码中缺少一个类型转换。无论在代码中何处执行abs(somevar),都需要通过执行abs(int(somevar))将字符串转换为整数。如果您发布堆栈跟踪或代码片段,将获得更多信息。

vbkedwbf

vbkedwbf5#

我认为你写的代码来自“Django电子商务入门”一书。错误在于你写的代码是{{ cart_sutotal|currency }}而不是{{ cart_subtotal }}

qv7cva1a

qv7cva1a6#

abs()的操作数类型错误:字符串

我解决了这个问题,想分享我的发现。

可能原因:带有“NaN”的十进制字段(或任何数字字段)

在我的例子中,我最终得到了“NaN”试图进入Decimal表单字段,这使得模板处理器在 *django/utils/ www.example.com * 中遇到了这个异常numberformat.py。我必须找出我在数据库中保存“NaN”的位置。

相关问题