Как форматировать отрицательные числа в 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 ''