2010-10-08 21 views

Répondre

5

Il y a une approche facile:

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

C'est généralement une mauvaise idée de stocker des devises comme un flotteur. Vous pouvez perdre de la précision et exposer vos données à des erreurs d'arrondis assez facilement. Maintenant, si vous cherchez à Superman III de l'argent supplémentaire et l'entonnoir dans un compte secondaire que vous possédez ... – Jordan

+1

AKA Office Space; Si vous êtes chanceux, vous n'aurez pas à brûler le bâtiment. – Chinasaur

16

Si vous préférez juste un nombre entier de cents:

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

Si vous voulez un décimal, il suffit d'utiliser ...

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

Si vous savez que le signe dollar sera toujours être là, vous pouvez utiliser dollars[1:] au lieu de dollars.strip('$'), mais en utilisant strip() vous permet également de gérer les chaînes qui omettent le signe dollar (5.99 au lieu de $5.99).

+2

Si vous préférez un nombre entier de cents, garder intégrale tout le chemin: 'd, c = dollars.strip (« $ ») .split ('.', 2); cents = int (d) * 100 + int (c.strip() [: 2]) '. Bien sûr, cela suppose que vous voulez arrondir des centimes fractionnaires vers 0 (insérez la blague de Superman III ici). –

+0

L'option décimale est celle à prendre. Je ferais une blague de 2 cents, mais il est tard. –

4

Si vous souhaitez utiliser décimal:

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

De là, l'ajout est assez simple

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

Tout d'abord, bande hors du caractère '$'. S'il est toujours toujours le premier caractère, c'est facile:

dollars[1:] 

Pour garder les cents parfaits sans se soucier de la représentation non parfaite de cents en virgule flottante, vous aurez envie d'utiliser des valeurs décimales:

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

Through décimal

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

Si vous n'allez être ajouter (et non la multiplication ou division) estimera juste stocker cents au lieu de dollars et ne pas utiliser t Le paquet décimal. Je suggère d'utiliser l'outil le plus simple pour le travail, et décimal ne fournit aucune valeur si vous ajoutez juste des dollars et des cents.

0

Si vous voulez conserver les fonds en cents pour l'arrondissement facile et parfois « $ » est manquante:

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

En supposant que la chaîne stockée dans la dollars variables a été généré en utilisant le module locale de python. Un moyen potentiellement plus simple de le convertir en float (décimal) consiste à utiliser la fonction atof du même module. Cela devrait fonctionner tant que vous utilisez les mêmes paramètres dans les deux sens (de la devise à la chaîne et vice versa).

par exemple:

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

pour reconvertir:

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

C'est la seule réponse qui prend en compte la possibilité de virgules comme des séparateurs de milliers, mais il convertit également en un flotteur au lieu d'un décimal qui provoque une perte de précision. – sherbang

0

Je sais ce une vieille question, mais cela est une approche très simple à votre problème qui est facilement lisible:

pour:

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

Il fonctionne aussi avec un plus grand nombre qui pourrait avoir une virgule dans ce:

dollars = '1,425,232.99' 
dollars = dollars.replace("$","").replace(",","") 
/* 1425232.99 */ 
Questions connexes