Как форматировать отрицательные числа в django-tables2?

Я ищу хорошее решение, чтобы сделать простой подкласс NumericColumn для моих таблиц, основанный на django-tables2. Я начал с этого:

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: '<' not supported between instances of 'str' and 'int', и кажется, что лямбда-функция получает уже отформатированное value. Я не вижу способа получить исходное значение в record через аксессор, и не думаю, что для такого сравнения хорошо делать обратное преобразование в Decimal. Хорошо, я могу проверить первый символ на '-', но это слишком некрасиво.

Помогите, пожалуйста.

Тип value кажется string, пока вы пытаетесь сравнить его с integer, поэтому для решения этой проблемы вы можете просто убедиться, что он преобразован в float, потому что вы используете значение float, а не string.

Измените его следующим образом:

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

Возможно, вы сможете использовать решение, подобное тому, которое включено в этот ответ, которое использует локаль для разбора чисел в строках.

Для вашего использования, вы можете попробовать это следующим образом:

(сначала убедитесь, что импортировали locale и установили соответствующую локаль. Я предполагаю, что вы используете что-то вроде US, основываясь на разделении запятыми вашего примера номера)

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

Тогда:

lambda value: 'text-danger' if locale.atof(value) < 0 else ''
Вернуться на верх