Форматирование строк с использованием десятичного числа Python - PullRequest
0 голосов
/ 02 ноября 2018

Я работаю над созданием отчета. Одна цифра в отчете должна быть выражена в миллионах. Я написал несколько базовых средств форматирования для обработки различных типов форматирования, которые должны быть согласованы по всему отчету. Для этого я использую лямбда-функции и форматирование строк. Две функции ниже. Один округлить, другой отформатировать.

formatter_round = lambda x: 0 if (x is None or x is bool) else round(x/1000000,1)

formatter_dollar = lambda x: '${:,.1}'.format(0) if (x is None or x == 0) else ('${:,.1}'.format(x) if x >= 0 else '$({:,.1})'.format(abs(x)))

Теперь приходит проблема. Смотрите мой пример ниже.

Я имею дело с двумя числами, a = 350000 и b = 850000.

Для a все работает так, как я ожидал. Число с плавающей запятой не всегда корректно при округлении (не «то, что я ожидал», а понятное поведение), но десятичная дробь верна.

a = 350000

formatter_dollar(formatter_round(a))
Out[89]: '$0.3'

a = Decimal(a)

formatter_dollar(formatter_round(a))
Out[91]: '$0.4'

Когда я запускаю тот же пример с b, это не работает.

b = 850000

formatter_dollar(formatter_round(b))
Out[93]: '$0.8'

b = Decimal(b)

formatter_dollar(formatter_round(b))
Out[95]: '$0.8'

У меня вопрос: как правильно округлить и отобразить числа?

Я думал, что моя проблема связана с числами с плавающей запятой, и a, кажется, подтверждает это. Затем, когда я запустил то же самое с b, я понял, что это не так.

...