2009-07-07 12 views
41

Tengo una cadena con el formato 'nn.nnnnn' en Python y me gustaría convertirla en un entero.Convierta una cadena en entero con decimal en Python

La conversión directa falla:

>>> s = '23.45678' 
>>> i = int(s) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '23.45678' 

que puede convertirlo en un decimal mediante el uso de: ''

>>> from decimal import * 
>>> d = Decimal(s) 
>>> print d 
23.45678 

También podría dividir en, y luego restar el decimal de cero, a continuación, añadir eso a todo el número ... puaj.

Pero prefiero tenerlo como int, sin conversiones de tipo innecesarias o maniobras.

+10

Matt, 23.45678 no es un número entero. Si quieres que Python convierta una cadena en un entero, asegúrate de darle un número entero. Los argumentos pueden hacerse de cualquier manera sobre lo que es "correcto", y al final alguien será infeliz. – Christopher

Respuesta

88

¿Qué tal esto?

>>> s = '23.45678' 
>>> int(float(s)) 
23 

O ...

>>> int(Decimal(s)) 
23 

O ...

>>> int(s.split('.')[0]) 
23 

dudo que va a ser mucho más simple que eso, me temo. Solo acéptalo y sigue adelante.

+3

Recuerda 'import decimal' y luego úsalo como 'decimal.Decimal (5) 'o haz' desde decimal decimal de importación' y úsalo como 'Decimal (5)'. Siempre lo olvido. – teewuane

+0

Debe tener en cuenta el tipo de redondeo que ofrece cada opción al valor. – Rapnar

1

que puede usar:

s = '23.245678' 
i = int(float(s)) 
13

¿Qué tipo de redondeo el comportamiento quieren? ¿Usted 2,67 a convertir en 3 o 2. Si desea utilizar el redondeo, intente esto:

s = '234.67' 
i = int(round(float(s))) 

De lo contrario, acaba de hacer:

s = '234.67' 
i = int(float(s)) 
2

"Convertir" sólo tiene sentido cuando se cambia de un tipo de datos a otro sin pérdida de fidelidad. El número representado por la cadena es un flotador y perderá precisión al ser forzado en un int.

En su lugar, desea redondear, (espero que los números no representen la moneda porque el redondeo se vuelve mucho más complicado).

round(float('23.45678')) 
3
>>> s = '23.45678' 
>>> int(float(s)) 
23 
>>> int(round(float(s))) 
23 
>>> s = '23.54678' 
>>> int(float(s)) 
23 
>>> int(round(float(s))) 
24 

No se especifica si el redondeo o no quiere ...

0
round(float("123.789")) 

le dará un valor entero, sino un tipo de flotador. Sin embargo, con el tipaje de pato de Python, el tipo real generalmente no es muy relevante. Esto también redondeará el valor, que es posible que no desee. Reemplazar 'ronda' con 'int' y lo tendrá truncado y una int real. De esta manera:

int(float("123.789")) 

Pero, de nuevo, el "tipo" real no suele ser tan importante.

1

La expresión int(float(s)) mencionada por otros es la mejor si quiere truncar el valor.Si desea redondear, use si el algoritmo de redondeo coincide con lo que desea (consulte round documentation); de lo contrario, debe usar Decimal y uno si usa los algoritmos de redondeo.

Cuestiones relacionadas