En Python, ¿cómo puedo analizar una cadena numérica como "545.2222"
su valor flotante correspondiente 545.2222
? ¿O analizar la cadena "31"
a un entero 31
?
Solo quiero saber cómo analizar un flotante str
a un float
, y (por separado) un int str
a un int
.
python
parsing
floating-point
type-conversion
integer
Tristan Havelick
fuente
fuente
type(my_object)
. El resultado generalmente se puede llamar como una función para hacer la conversión. Por ejemplo, lostype(100)
resultadosint
, por lo que puede llamarint(my_object)
para intentar convertirmy_object
a un entero. Esto no siempre funciona, pero es una buena "primera suposición" cuando se codifica.int(x) if int(x) == float(x) else float(x)
Respuestas:
fuente
int(a)
sinoint(float(a))
?int(a)
dará un error de que la cadena no es un entero válido:ValueError: invalid literal for int() with base 10: '545.222'
pero la conversión de un flotante a un int es una conversión compatible.ValueError
si quiere estar segurofuente
/
operador en flotadores / ints. Dependiendo del contexto, puede ser preferible devolver int o float, no ambos.try
para lanzar una excepción cuando no es convertible para flotar.s = u'\u0000'
ValueError
el correspondienteexcept
: PMétodo de Python para verificar si una cadena es flotante:
Un nombre más largo y preciso para esta función podría ser:
is_convertible_to_float(value)
Lo que es y no es un flotador en Python puede sorprenderte:
¿Crees que sabes qué son los números? ¡No eres tan bueno como crees! No es una gran sorpresa.
¡No use este código en software vital!
Capturando amplias excepciones de esta manera, matando canarios y engullendo la excepción, se crea una pequeña posibilidad de que un flotador válido como cadena devuelva falso. La
float(...)
línea de código puede fallar por cualquiera de las miles de razones que no tienen nada que ver con el contenido de la cadena. Pero si está escribiendo software vital en un lenguaje prototipo de escritura de pato como Python, entonces tiene problemas mucho mayores.fuente
UTF-8
glifo para un chino4
se ha transformado a lo largo de los años dependiendo de cómo los desarrolladores de stackoverflow cambien su esquema de codificación de caracteres en su conjunto de herramientas de Microsoft. Es una curiosidad verlo flip flop a lo largo de los años a medida que los nuevos esquemas de conversión afirman sus nuevas ideologías. Pero sí, cualquierUTF-8
glifo para un número oriental oriental no es un flotador de Python. Bazinga"- 12.3"
y"45 e6"
TypeError, ValueError
Este es otro método que merece ser mencionado aquí, ast.literal_eval :
Es decir, un 'eval' seguro
fuente
python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>>
para aclarar por qué esto es un problema, si desea dejar los números de teléfono solos y no asumir que son expresiones matemáticas, entonces este enfoque no es para usted.ast.literal_eval
y se ha discutido aquí .fuente
float("nan")
es un valor flotante perfectamente válido que la respuesta anterior no captaría en absoluto192.168.0.1
; o"This is not a good approach. :)"
Localización y comas
Debe considerar la posibilidad de comas en la representación de cadena de un número, para casos como el
float("545,545.2222")
que arroja una excepción. En su lugar, utilice métodoslocale
para convertir las cadenas en números e interpretar comas correctamente. Ellocale.atof
método se convierte en flotante en un paso una vez que la configuración regional se ha establecido para la convención de números deseada.Ejemplo 1 - Convenciones numéricas de los Estados Unidos
En los Estados Unidos y el Reino Unido, las comas se pueden usar como un separador de miles. En este ejemplo con la configuración regional estadounidense, la coma se maneja correctamente como un separador:
Ejemplo 2 - Convenciones numéricas europeas
En la mayoría de los países del mundo , las comas se utilizan para las marcas decimales en lugar de puntos. En este ejemplo con configuración regional en francés, la coma se maneja correctamente como una marca decimal:
El método
locale.atoi
también está disponible, pero el argumento debe ser un número entero.fuente
x = '1'; locale.atof(x)
regresa1.0
cuando realmente quiero1
.locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x)
locale.atoi
en un intento y usarlocale.atof
en una excepción, probablemente sea más legible.)Si no eres reacio a los módulos de terceros, puedes consultar el módulo fastnumbers . Proporciona una función llamada fast_real que hace exactamente lo que esta pregunta está pidiendo y lo hace más rápido que una implementación de Python puro:
fuente
Codelogic de usuarios y harley son correctos, pero tenga en cuenta que si sabe que la cadena es un número entero (por ejemplo, 545) puede llamar a int ("545") sin primero emitir un flotante.
Si sus cadenas están en una lista, también puede usar la función de mapa.
Solo es bueno si todos son del mismo tipo.
fuente
Es bueno que pidas hacer esto por separado. Si los está mezclando, puede estar preparándose para problemas más tarde. La respuesta simple es:
"545.2222"
flotar:"31"
a un entero:Otras conversiones, int hacia y desde cadenas y literales:
Conversiones de varias bases, y debe conocer la base de antemano (10 es el valor predeterminado). Tenga en cuenta que puede prefijarlos con lo que Python espera para sus literales (ver a continuación) o eliminar el prefijo:
Si no conoce la base de antemano, pero sabe que tendrán el prefijo correcto, Python puede inferir esto si lo pasa
0
como base:Literales no decimales (es decir, enteros) de otras bases
Si su motivación es que su propio código represente claramente valores específicos codificados, sin embargo, es posible que no necesite convertir desde las bases; puede dejar que Python lo haga automáticamente con la sintaxis correcta.
Puede usar los prefijos apropos para obtener la conversión automática a enteros con los siguientes literales . Estos son válidos para Python 2 y 3:
Binario, prefijo
0b
Octal, prefijo
0o
Hexadecimal, prefijo
0x
Esto puede ser útil al describir indicadores binarios, permisos de archivo en código o valores hexadecimales para colores; por ejemplo, no tenga en cuenta las comillas:
Hacer que los octals ambiguos de Python 2 sean compatibles con Python 3
Si ve un número entero que comienza con un 0, en Python 2, esta es una sintaxis octal (en desuso).
Es malo porque parece que el valor debería ser
37
. Entonces, en Python 3, ahora genera unSyntaxError
:Convierta sus octals de Python 2 a octales que funcionen en 2 y 3 con el
0o
prefijo:fuente
La pregunta parece un poco vieja. Pero permítanme sugerir una función, parseStr, que hace algo similar, es decir, devuelve entero o flotante y si una cadena ASCII dada no se puede convertir en ninguna de ellas, la devuelve intacta. El código, por supuesto, puede ajustarse para hacer solo lo que desee:
fuente
1e3
es un número en python, pero una cadena de acuerdo con su código.float("545.2222")
yint(float("545.2222"))
fuente
Yo uso esta función para eso
Convertirá la cadena a su tipo
fuente
parse_str(' 1')
(con un espacio) volveráNone
, no1
.El analizador YAML puede ayudarlo a descubrir qué tipo de datos es su cadena. Use
yaml.load()
, y luego puede usartype(result)
para probar el tipo:fuente
fuente
except
sección si no estás haciendo nada allí? float () aumentaría para ti.int
ofloat
dependiendo de lo que representa la cadena. Puede aumentar las excepciones de análisis o [tener un comportamiento inesperado] [1].fuente
Debe tener en cuenta el redondeo para hacer esto correctamente.
Es decir, int (5.1) => 5 int (5.6) => 5 - incorrecto, debe ser 6, entonces hacemos int (5.6 + 0.5) => 6
fuente
int
yfloat
. Y dará una excepción, cuandon
es una cadena, como OP deseado. Quizás quiso decir: cuandoint
se desea un resultado,round
debe hacerse DESPUÉS de la conversión a flotante. Si la función SIEMPRE devuelve un int, entonces no necesita la parte except, puede ser el cuerpo completo de la funciónint(round(float(input)))
. Si la función debe devolver un int si es posible, de lo contrario un flotador, ¡entonces la solución original de javier es correcta!Me sorprende que nadie haya mencionado regex porque a veces la cadena debe estar preparada y normalizada antes de enviarla al número
uso:
y, por cierto, algo para verificar que tienes un número:
fuente
Para escribir en python, use las funciones de constructor del tipo, pasando la cadena (o cualquier valor que esté intentando convertir) como parámetro.
Por ejemplo:
Detrás de escena, python está llamando al
__float__
método de los objetos , que debería devolver una representación flotante del parámetro. Esto es especialmente poderoso, ya que puede definir sus propios tipos (usando clases) con un__float__
método para que se pueda convertir en un flotante usando float (myobject).fuente
Esta es una versión corregida de https://stackoverflow.com/a/33017514/5973334
Esto intentará analizar una cadena y devolver
int
ofloat
dependiendo de lo que representa la cadena. Puede aumentar las excepciones de análisis o tener un comportamiento inesperado .fuente
Pase su cadena a esta función:
Devolverá int, float o string dependiendo de lo que se haya pasado.
cadena que es un int
cuerda que es un flotador
cadena que es una cadena
cuerda que parece un flotador
fuente
Utilizar:
Esta es la forma más pitónica que se me ocurrió.
fuente
float
. Eltry
...catch
bloque probablemente debería estar dentro delfor
bucle.Maneja hexadecimal, octal, binario, decimal y flotante
Esta solución manejará todas las convenciones de cadena para números (todo lo que sé).
Este resultado del caso de prueba ilustra de lo que estoy hablando.
Aquí está la prueba:
fuente
Utilizar:
fuente
Esta es una función que convertirá cualquiera
object
(no solostr
)int
aofloat
, en función de si la cadena real suministrada se parece aint
ofloat
. Además, si se trata de un objeto que tiene ambos__float
y__int__
métodos, el uso predeterminado es__float__
fuente
Mediante el uso de métodos int y float podemos convertir una cadena en enteros y flotantes.
fuente
eval()
Es una muy buena solución a esta pregunta. No necesita verificar si el número es int o flotante, solo da el equivalente correspondiente. Si se requieren otros métodos, intentetry-except también se puede utilizar como alternativa. Intente convertir la cadena a int dentro del bloque try. Si la cadena fuera un valor flotante, arrojará un error que será atrapado en el bloque excepto, como este
fuente
Aquí hay otra interpretación de su pregunta (pista: es vago). Es posible que estés buscando algo como esto:
Funciona así...
Teóricamente, hay una vulnerabilidad de inyección. La cadena podría, por ejemplo, ser
"import os; os.abort()"
. Sin ningún antecedente sobre el origen de la cadena, sin embargo, la posibilidad es la especulación teórica. Como la pregunta es vaga, no está del todo claro si esta vulnerabilidad realmente existe o no.fuente
eval()
es más de 3 veces más lenta quetry: int(s) except: float(s)
.eval
es una mala práctica (debes saberlo porque tienes 310k de reputación)