2010-10-08 43 views

Respuesta

5

Hay un enfoque sencillo:

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

Por lo general, es una mala idea almacenar moneda como un flotador. Puede perder precisión y exponer sus datos a errores de redondeo con bastante facilidad. Ahora, si buscas en Superman III un dinero extra y lo canalizas a una cuenta secundaria que posees ... – Jordan

+1

AKA Office Space; si tienes suerte no terminarás teniendo que quemar el edificio. – Chinasaur

16

Si prefiere simplemente un número entero de centavos:

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

Si quieres un decimal, sólo tiene que utilizar ...

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

Si sabe que el signo del dólar siempre lo hará esté allí, podría usar dollars[1:] en lugar de dollars.strip('$'), pero usar strip() le permite también manejar cadenas que omiten el signo de dólar (5.99 en lugar de $5.99).

+2

Si prefiere un número entero de centavos, mantenga integrante todo el camino: 'd, c = dollars.strip ('$') .split ('.', 2); cents = int (d) * 100 + int (c.strip() [: 2]) '. Por supuesto, esto supone que desea redondear centavos fraccionarios hacia 0 (inserte aquí la broma de Superman III elegida). –

+0

La opción decimal es la que se debe tomar. Haría una broma de 2 centavos, pero es tarde. –

4

Si desea utilizar decimal:

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

A partir de ahí la adición es bastante simple

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

En primer lugar, quitarse el carácter '$'. Si siempre es consistentemente el primer carácter, eso es fácil:

dollars[1:] 

para mantener los centavos perfectas sin tener que preocuparse acerca de la representación no perfecta de centavos en coma flotante, tendrá que utilizar valores decimales:

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

a través del paquete decimal

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

Si sólo se va a añadir (y no multiplicar o dividir) consideran simplemente almacenar centavos en lugar de dólares y no mediante la t el paquete decimal Sugiero usar la herramienta más simple para el trabajo, y el decimal no proporciona ningún valor si solo está agregando dólares y centavos.

0

Si desea mantener dinero en centavos para facilitar el redondeo y, a veces '$' no se encuentra:

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

Suponiendo que la cadena almacenada en la variable dollars fue generado usando el módulo local de python. Una forma potencialmente más limpia de convertirlo a flotación (decimal) es usar la función atof del mismo módulo. Debería funcionar siempre que use los mismos parámetros setlocale en ambas direcciones (de moneda a cadena y viceversa).

por ejemplo:

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

a convertir de nuevo:

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

Esta es la única respuesta que tiene en cuenta la posibilidad de comas como separadores de miles, pero también se convierte en un flotante en lugar de un decimal que causa una pérdida de precisión. – sherbang

0

Sé que esto una vieja pregunta, pero este es un enfoque muy simple a su problema que es fácil de leer:

para:

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

También trabaja con un número más grande que puede tener una coma en ella:

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