【问题标题】:How to format negative numbers in django-tables2?如何在 django-tables2 中格式化负数?
【发布时间】:2022-01-12 09:07:48
【问题描述】:

我正在寻找一个不错的解决方案,基于 django-tables2 为我的表创建一个简单的子类 NumericColumn。我从那个开始:

class NumericColumn(Column):

    def render(self, value):
        return '{:0,.2f}'.format(value)

在我决定将负值变为红色之前效果很好:

class NumericColumn(Column):
    attrs = {
        'td': {
            'class': lambda value: 'text-danger' if value < 0 else ''
        }
    }
    
    def render(self, value):
        return '{:0,.2f}'.format(value)

代码周期性地因TypeError: '&lt;' not supported between instances of 'str' and 'int' 而失败,并且似乎 lambda 函数接收到已格式化的value。我看不到通过访问器在record 中获取原始值的方法,并且我认为将反向转换为 Decimal 进行此类比较并不好。好的,我可以测试'-'的第一个字符,但它太丑了。

请帮忙。

【问题讨论】:

  • 你的方法定义看起来不错,但它是如何使用的呢?看起来问题来自代码的另一部分。你确定value 实际上总是int 吗?这是什么record
  • 我认为问题在于value似乎来到了已经由render方法格式化的lambda函数,如果我尝试将value转换为intDecimal,我收到这样的错误:could not convert string to float: '1,750.40'

标签: python django django-tables2


【解决方案1】:

value 的类型在您尝试将其与 integer 进行比较时似乎为 string,因此要解决此问题,您只需确保将其转换为 float,因为您使用的是浮点值而不是字符串.

改成这样:

lambda value: 'text-danger' if float(value) < 0 else ''

【讨论】:

  • 感谢您的回答。我当然认为应该明确指定value 的类型(我使用了Decimal,但没有区别);但是问题是value 似乎已经使用render 方法格式化的lambda 函数,并且我收到这样的错误:could not convert string to float: '1,750.40'
【解决方案2】:

您也许可以使用this answer 中包含的解决方案,它使用语言环境来解析字符串中的数字。

为了你的使用,你可以这样尝试:

(首先确保导入语言环境并设置适当的语言环境。我猜你正在使用类似美国的东西,基于你的示例编号的逗号分隔)

import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

然后:

lambda value: 'text-danger' if locale.atof(value) < 0 else ''

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2022-11-29
    相关资源
    最近更新 更多