2011-01-24 20 views
29

Python proporciona un método conveniente de largo() para convertir cadena a largo:conversión de cadena a largo en pitón

long('234') 

; convierte '234' en una larga

Si las claves de usuario en 234,89 continuación, Python lanzará un mensaje de error:

ValueError: invalid literal for long() 
with base 10: '234.89' 

¿Cómo debemos un programador de Python maneja escenarios en los que una cadena con un valor decimal?

Gracias =)

+2

¿convertirlo a flotación? ¿Capturas el error e informas al usuario? – John

+4

Esta pregunta y sus respuestas solo se aplican a Python 2. Python 3 ya no tiene un tipo largo, consulte http://python3porting.com/differences.html#long – hertzsprung

Respuesta

25

long sólo puede tomar los convertibles de cuerda que puede terminar en una base 10 numeral. Entonces, el decimal está causando el daño. Lo que puede hacer es float el valor antes de llamar al long. Si su programa está en Python 2.x donde importan la diferencia larga y la int, y está seguro de que no está usando números enteros grandes, podría haber estado bien usando int para proporcionar la clave también.

Por lo tanto, la respuesta es long(float('234.89')) o simplemente podría ser int(float('234.89')) si no está utilizando grandes números enteros. También tenga en cuenta que esta diferencia no surge en Python 3, porque int se actualiza a largo de manera predeterminada. Todos los enteros son largos en python3 y la llamada a encubierto es solo int

+0

Gracias, esto es realmente útil – zfranciscus

+2

int ('234.89') falla con el mismo error que se muestra en la pregunta. – payne

+0

@ payne- gracias por señalar. Lo he corregido Tu era correcto. –

12

Bueno, anhela no pueden contener nada más que números enteros.

Una opción es utilizar un flotador: float('234.89')

La otra opción es truncar o redonda. La conversión de un flotador a una larga truncará para usted: long(float('234.89'))

>>> long(float('1.1')) 
1L 
>>> long(float('1.9')) 
1L 
>>> long(round(float('1.1'))) 
1L 
>>> long(round(float('1.9'))) 
2L