2011-12-26 12 views
5

Mam liczbę całkowitą reprezentującą cenę w centach. Używając ciągów w formacie Python, jak mogę przekonwertować tę wartość na dolary z dwoma miejscami dziesiętnymi? Przykłady:Jak korzystać z formatowania ciągów w języku Python w celu przekonwertowania liczby całkowitej reprezentującej centy na liczbę zmiennoprzecinkową reprezentującą dolary?

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

EDYCJA: Powinienem podać trochę tła. Przechowuję ceny w bazie danych jako liczby całkowite, aby upewnić się, że nie tracę precyzji. Nie chcę używać dziesiętnego typu danych, ponieważ wartości te będą również używane w obliczeniach w JavaScript, więc liczby całkowite będą najprostsze w obsłudze. Chcę móc wyświetlać w szablonie Django sformatowaną wartość za pomocą znacznika stringformat. W związku z tym dzielenie liczby przez 100 nie działa. Czy istnieje sposób na dodanie kropki dziesiętnej bez dzielenia?

+1

Nie należy używać pacy dla waluty. To absolutnie nie tak. Dziesiętny działa idealnie do Twoich potrzeb. Można go przekonwertować na ciąg znaków (w przypadku Javascript), a wszystkie obliczenia finansowe działają poprawnie z dziesiętnym. –

Odpowiedz

12

Ty powinien starać się, aby nigdy nie używać pływaków do reprezentowania pieniędzy (niedokładność numeryczna zbyt łatwo może się wkraść). Moduł dziesiętny zapewnia użyteczny typ danych do reprezentowania pieniędzy, ponieważ może dokładnie przedstawiać liczby dziesiętne, takie jak 0,05.

Może być stosowany tak:

import decimal 
cents = 999 
dollars = decimal.Decimal(cents)/100 
print dollars 
5

Stosując str.format:

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

daje

12.34 
0.05 
9.99 

W python2.6 użyciu '{0:.2f}' zamiast '{:.2f}'.

6

Jeśli nie dbają o lokalizacji, a następnie po prostu podzielić przez 100 i sformatować go:

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

Jeśli dbasz o lokalizacji, a następnie użyć modułu 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' 
+0

+1 za uwzględnienie również przykładu l10n. Dobra robota. – AgentK

+0

Nie jestem pewien, czy praca z 'floats' i walutą jest dobrym pomysłem. –

Powiązane problemy