tengo dólares en una variable de cadenapython: cómo convertir moneda a decimal?
dollars = '$5.99'
¿Cómo se convierte a un decimal en lugar de una cadena de modo que pueda realizar operaciones con ella como la adición de dólares a la misma?
tengo dólares en una variable de cadenapython: cómo convertir moneda a decimal?
dollars = '$5.99'
¿Cómo se convierte a un decimal en lugar de una cadena de modo que pueda realizar operaciones con ella como la adición de dólares a la misma?
Hay un enfoque sencillo:
dollar_dec = float(dollars[1:])
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
).
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). –
La opción decimal es la que se debe tomar. Haría una broma de 2 centavos, pero es tarde. –
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
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:])
a través del paquete decimal
>>> dollars = '$5.99'
>>> import decimal
>>> decimal.Decimal(dollars[1:])
Decimal('5.99')
>>>
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.
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))
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
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
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 */
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
AKA Office Space; si tienes suerte no terminarás teniendo que quemar el edificio. – Chinasaur