Cómo convertir una cadena en Float o Int en Python

Jinku Hu 30 enero 2023
  1. float() para convertir una cadena a float en Python
  2. int() para convertir la cadena a int en Python
  3. ast.literal_eval para convertir la cadena a float o int en Python
  4. Localización y comas en la conversión de una cadena a float en Python
  5. Comparación de las prestaciones de los diferentes métodos para convertir string a float o int en Python
Cómo convertir una cadena en Float o Int en Python

Este artículo del tutorial introducirá cómo convertir una cadena a float o int en Python.

float() para convertir una cadena a float en Python

float() convierte la cadena en el número apuntador float, si es posible.

>>> float('111.2222')
111.2222
>>> float('111.0')
111.0
>>> float('111')
111.0

int() para convertir la cadena a int en Python

int() podría convertir la cadena a un entero si la cadena dada es la representación de un entero. De lo contrario, levantará ValueError.

>>> int('111')
111
>>> int('111.0')
Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    int('111.0')
ValueError: invalid literal for int() with base 10: '111.0'
>>> int('111.22222')
Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    int('111.22222')
ValueError: invalid literal for int() with base 10: '111.22222'

Podrías convertir la cadena a float primero y luego lanzarla a in si la cadena dada es la representación de un número que apunta flotante.

>>> int(float('111.0'))
111

ast.literal_eval para convertir la cadena a float o int en Python

ast.literal_eval(string) evalúa de forma segura la cadena dada que contiene una expresión en Python. Podría convertir la cadena en float o int automáticamente.

>>> ast.literal_eval('111.2222')
111.2222
>>> ast.literal_eval('111.0')
111.0
>>> ast.literal_eval('111')
111

Localización y comas en la conversión de una cadena a float en Python

Si la coma ,existe en la representación de la cadena, entonces la conversión float arrojará una excepción ValueError. Pero las comas se usan regularmente como separador de mil en países como EE.UU. o el Reino Unido, por ejemplo 111,111.22, o como signo decimal en la mayoría de los países europeos, por ejemplo 111,222.

>>> float('111,111.22')
Traceback (most recent call last):
  File "<pyshell#54>", line 1, in <module>
    float('111,111.22')
ValueError: could not convert string to float: '111,111.22'
>>> float('111,111')
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    float('111,111')
ValueError: could not convert string to float: '111,111'

El módulo locale debería usarse para asignar la información de localización y luego la función locale.atof() podría analizar la cadena dada como un float de acuerdo con los ajustes de localización.

Comas como separador de mil en US o UK

>>> import locale
>>> A = '111,111.222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(A)
111111.222
>>> locale.atof('111,111')
111111.0

La coma , podría ser interpretada correctamente si se da el ajuste de localización correcto.

Tenga en cuenta también que el resultado de la conversión es siempre de tipo float, incluso si la representación de la cadena dada es un número entero.

Las comas como marca demencial en los países europeos

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'nl_NL')
'nl_NL'
>>> locale.atof('111,222')
111.222
>>> locale.atof('111.111,222')
111111.222

El punto 111,222 se convierte en 111.222 correctamente, y 111.111,222 también podría convertirse correctamente en 111111.222, ya que el punto . se usa como el milésimo separador en países europeos como los Países Bajos.

Comparación de las prestaciones de los diferentes métodos para convertir string a float o int en Python

Utilizamos timeit para comprobar el rendimiento de la eficiencia entre los diferentes métodos.

>>> import timeint
>>> timeit.timeit('float(111.2222)', number=1000000)
0.14707240000007005
>>> timeit.timeit('ast.literal_eval("111.2222")', setup='import ast', number=1000000)
4.779956100000163
>>> timeit.timeit('locale.atof("111.2222")', setup='import locale; locale.setlocale(locale.LC_ALL, "en_US.UTF-8")', number=1000000)
6.092166299999917

El método ast.literal_eval() es tremendamente más lento que el método float como se muestra arriba. No debería ser la primera opción si simplemente necesita convertir string a float o int en Python. El método ast.literal_eval() está sobredimensionado en esta aplicación ya que su principal objetivo debería ser evaluar la cadena que contiene la expresión en Python.

locale.atof() es también extremadamente lento, por lo que sólo debe usarse cuando existan comas en la cadena para la convención en US o UK, o el punto . significa el separador de mil pero la coma ,significa la marca decimal en los países europeos. En otras palabras, debería usar locale.atof() si es realmente necesario.

Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - Python String