2010-10-08 16 views

Odpowiedz

5

Jest łatwy dojazd:

dollar_dec = float(dollars[1:]) 
+6

Zwykle złym pomysłem jest przechowywanie waluty w trybie zmiennoprzecinkowym. Możesz stracić precyzję i łatwo narazić swoje dane na błędy zaokrąglania. Teraz, jeśli szukasz Supermana III, dostaniesz dodatkowe pieniądze i wpuścisz je na własne konto boczne ... – Jordan

+1

AKA Office Space; jeśli masz szczęście, nie będziesz musiał spalić budynku. – Chinasaur

16

Jeśli wolisz tylko całkowitą liczbę centów:

cents_int = int(round(float(dollars.strip('$'))*100)) 

Jeśli chcesz dziesiętny, wystarczy użyć ...

from decimal import Decimal 
dollars_dec = Decimal(dollars.strip('$')) 

Jeśli wiesz, że znak dolara będzie zawsze tam, możesz użyć dollars[1:] zamiast dollars.strip('$'), ale użycie strip() pozwala ci również obsługiwać ciągi, które pomijają znak dolara (5.99 zamiast $5.99).

+2

Jeśli wolisz całkowitą liczbę centów, utrzymać go integralną całą drogę: 'D, C = dollars.strip („$”) .split (".", 2); centów = int (d) * 100 + int (c.strip() [: 2]) '. Oczywiście zakłada to, że chcesz zaokrąglić centa ułamkowe w stronę 0 (wybierz tutaj żart Supermana III). –

+0

Decyduje o tym opcja dziesiętna. Zrobiłbym żart z 2 centów, ale jest późno. –

4

Jeśli chcesz użyć dziesiętny:

from decimal import Decimal 
dollars = Decimal(dollars.strip('$')) 

Stamtąd dodanie jest dość prosta

dollars += 1 # Would add 1 to your decimal 
0

Najpierw zdejmować znaku '$'. Jeśli jest to zawsze konsekwentnie pierwszy znak, który jest łatwy:

dollars[1:] 

Aby utrzymać centów idealny bez martwienia się o nie-idealne reprezentacji centów w zmiennoprzecinkowych, będziemy chcieli używać wartości dziesiętnych:

from decimal import * 
Decimal(dollars[1:]) 
3

Poprzez pakietu dziesiętnych

>>> dollars = '$5.99' 
>>> import decimal 
>>> decimal.Decimal(dollars[1:]) 
Decimal('5.99') 
>>> 
1

Jeśli tylko będzie dodanie (a nie mnożenia lub dzielenia) rozważyć tylko przechowywanie centów zamiast dolarów, a nie za pomocą t on pakiet dziesiętny. Sugeruję użycie najprostszego narzędzia do zadania, a dziesiętny nie zapewnia żadnej wartości, jeśli tylko dodajesz dolary i centy.

0

Jeśli chcesz zachować co płacisz w centów do łatwego zaokrąglenia, a czasem „$” brakuje:

for dollars in ('$5.99','6.77'): 
    cents = int(float((dollars[1:] if dollars.startswith('$') else dollars))*100) 
    print '%s = %i cents = %i dollars and %i cents' % ((dollars, cents)+divmod(cents, 100)) 
11

Zakładając ciąg przechowywane w zmiennej dollars został wygenerowany przy użyciu modułu lokalnego języka Pythona. Potencjalnie czystszym sposobem na konwersję z powrotem na zmienną (dziesiętną) jest użycie funkcji atof z tego samego modułu. Powinno działać tak długo, jak używasz tych samych parametrów w obu kierunkach (od waluty do łańcucha i na odwrót).

na przykład:

import locale 
locale.setlocale(locale.LC_ALL, '') 
value = 122445.56 
value_s = locale.currency(value, grouping=True) 
#generates $122,445.56 

do przekształcenia go z powrotem:

value2 = locale.atof(value_s[1:]) 
#value2 = 122445.56 
value == value2 #True 
+0

Jest to jedyna odpowiedź, która uwzględnia możliwość przecinków jako separatorów tysięcy, ale również konwertuje na wartość zmiennoprzecinkową zamiast dziesiętnej, co powoduje utratę precyzji. – sherbang

0

Wiem, że to stare pytanie, ale jest to bardzo proste podejście do problemu, który jest czytelny:

dla:

dollars = '$5.99' 
dollars = dollars.replace("$","").replace(",","") 
/* 5.99 */ 

Działa również z większej liczby, które mogą mieć przecinek w nim:

dollars = '1,425,232.99' 
dollars = dollars.replace("$","").replace(",","") 
/* 1425232.99 */ 
Powiązane problemy