Как использовать форматирование строки Python для преобразования целого числа, представляющего центы, в число с плавающей точкой, представляющее доллары? - PullRequest
6 голосов
/ 26 декабря 2011

У меня есть целое число, представляющее цену в центах. Используя строки формата Python, как я могу преобразовать это значение в доллары с двумя десятичными знаками? Примеры:

1234 => 12.34
5 => 0.05
999 => 9.99

РЕДАКТИРОВАТЬ: Я должен дать некоторую справку. Я храню цены в базе данных в виде целых чисел, чтобы не потерять точность. Я не хочу использовать тип данных Decimal, потому что эти значения также будут использоваться в вычислениях в Javascript, поэтому с целыми числами будет проще работать для этого. Я хочу иметь возможность отображать в шаблоне Django отформатированное значение с помощью тега stringformat. Таким образом, деление числа на 100 не работает. Есть ли способ добавить десятичную точку без деления?

Ответы [ 3 ]

13 голосов
/ 26 декабря 2011

Вы должны стараться избегать использования поплавков для обозначения денег (числовая неточность может слишком легко закрасться).Модуль десятичной дроби предоставляет полезный тип данных для представления денег, поскольку он может точно представлять десятичные числа, такие как 0,05.

. Он может использоваться следующим образом:

import decimal
cents = 999
dollars = decimal.Decimal(cents) / 100
print dollars
6 голосов
/ 26 декабря 2011

Если вам не нужна локализация, просто разделите на 100 и отформатируйте ее:

>>> for cents in [ 1234, 5, 999 ]:
...     '{0:.02f}'.format(float(cents) / 100.0)
...
'12.34'
'0.05'
'9.99'

Если вам нужна локализация, используйте модуль locale:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, "") # use the user-default locale
'en_US.UTF-8'
>>> for cents in [ 1234, 5, 999 ]:
...     locale.currency(float(cents) / 100.0)
...
'$12.34'
'$0.05'
'$9.99'
5 голосов
/ 26 декабря 2011

Использование str.format :

for i in (1234,5,999):
    print('{:.2f}'.format(i/100.))

приводит к

12.34
0.05
9.99

В Python2.6 используйте '{0:.2f}' вместо '{:.2f}'.

...