Python: ¿Cómo convertir moneda a decimal?

tengo dólares en una cadena variable

dollars = '$5.99' 

¿Cómo puedo convertir esto a un decimal en lugar de una cadena para que pueda realizar operaciones con él como agregarle dólares?

Hay un enfoque fácil:

 dollar_dec = float(dollars[1:]) 

Si prefieres un número entero de centavos:

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

Si quieres un decimal, solo usa …

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

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

Suponiendo que la cadena almacenada en la variable dollars se generó usando el módulo de configuración regional de python. Una forma potencialmente más limpia de convertirlo de nuevo a flotante (decimal) es usar la función atof del mismo módulo. Debería funcionar siempre que utilice los mismos parámetros setlocale en ambas direcciones (de la moneda a la 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 

para convertirlo de nuevo:

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

Si quieres usar decimal:

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

A partir de ahí la adición es bastante sencilla.

 dollars += 1 # Would add 1 to your decimal 

A través del paquete decimal

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

Si solo va a agregar (y no multiplicar o dividir) considere simplemente almacenar centavos en lugar de dólares y no usar el paquete decimal. Sugiero usar la herramienta más sencilla para el trabajo, y el decimal no proporciona ningún valor si solo está agregando dólares y centavos.

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

para:

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

También funciona con un número mayor que podría tener una coma:

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

Primero, despega el carácter ‘$’. Si siempre es el primer personaje, eso es fácil:

 dollars[1:] 

Para mantener los centavos perfectos sin preocuparse por la representación no perfecta de centavos en punto flotante, querrá usar valores decimales:

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

Si desea mantener el dinero en centavos para redondearlo fácilmente y en ocasiones falta ‘$’:

 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)) 

Aquí hay otro ejemplo de conversión de una cadena de moneda desordenada en un decimal redondeado al centavo:

 from decimal import Decimal, ROUND_DOWN messy = ', $1, 111.2199 ,,,' less_messy = Decimal(''.join(messy.replace(',','').split()).replace('$','')) converted = less_messy.quantize(Decimal(".01"), rounding=ROUND_DOWN) print(converted) 1111.21 

Otras opciones de redondeo incluyen: ROUND_HALF_UP , ROUND_HALF_DOWN , ROUND_UP