¿Cómo analizo una cadena en flotante o int?
¿Cómo puedo convertir un str
a float
?
"545.2222" -> 545.2222
¿O una str
a una int
?
"31" -> 31
Para lo contrario, consulte Convertir un número entero en una cadena en Python y Convertir un flotante en una cadena sin redondearlo .
En su lugar, utilice ¿Cómo puedo leer las entradas como números? para cerrar preguntas duplicadas en las que OP recibió una cadena de la entrada del usuario e inmediatamente quiere convertirla, o esperaba input
(en 3.x) convertir el tipo automáticamente.
>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545
Método Python2 para comprobar si una cadena es un flotante:
def is_float(value):
if value is None:
return False
try:
float(value)
return True
except:
return False
Para la versión Python3 de is_float, consulte: Comprobar si una cadena se puede convertir a flotante en Python
Un nombre más largo y preciso para esta función podría ser:is_convertible_to_float(value)
Lo que es y lo que no es un flotante en Python puede sorprenderte:
Las siguientes pruebas unitarias se realizaron utilizando python2. Verifique que Python3 tenga un comportamiento diferente en cuanto a qué cadenas se pueden convertir en flotantes. Una diferencia confusa es que ahora se permite cualquier número de guiones bajos interiores: (float("1_3.4") == float(13.4))
es Verdadero
val is_float(val) Note
-------------------- ---------- --------------------------------
"" False Blank string
"127" True Passed string
True True Pure sweet Truth
"True" False Vile contemptible lie
False True So false it becomes true
"123.456" True Decimal
" -127 " True Spaces trimmed
"\t\n12\r\n" True whitespace ignored
"NaN" True Not a number
"NaNanananaBATMAN" False I am Batman
"-iNF" True Negative infinity
"123.E4" True Exponential notation
".1" True mantissa only
"1_2_3.4" False Underscores not allowed
"12 34" False Spaces not allowed on interior
"1,234" False Commas gtfo
u'\x30' True Unicode is fine.
"NULL" False Null is not special
0x3fade True Hexadecimal
"6e7777777777777" True Shrunk to infinity
"1.797693e+308" True This is max value
"infinity" True Same as inf
"infinityandBEYOND" False Extra characters wreck it
"12.34.56" False Only one dot allowed
u'四' False Japanese '4' is not a float.
"#56" False Pound sign
"56%" False Percent of what?
"0E0" True Exponential, move dot 0 places
0**0 True 0___0 Exponentiation
"-5e-5" True Raise to a negative number
"+1e1" True Plus is OK with exponent
"+1e1^5" False Fancy exponent not interpreted
"+1e1.3" False No decimals in exponent
"-+1" False Make up your mind
"(1)" False Parenthesis is bad
¿Crees que sabes qué son los números? ¡No eres tan bueno como crees! No es una gran sorpresa.
¡No utilice este código en software crítico para la vida!
Detectar excepciones amplias de esta manera, matar canarios y devorar la excepción crea una pequeña posibilidad de que un flotante válido como cadena devuelva falso. La float(...)
línea de código puede fallar por miles de razones que no tienen nada que ver con el contenido de la cadena. Pero si estás escribiendo software crítico para la vida en un lenguaje prototipo de tipeo como Python, entonces tienes problemas mucho mayores.
def num(s):
try:
return int(s)
except ValueError:
return float(s)
Otro método que merece ser mencionado aquí es ast.literal_eval
:
Esto se puede utilizar para evaluar de forma segura cadenas que contienen expresiones de Python de fuentes que no son de confianza sin la necesidad de analizar los valores uno mismo.
Es decir, una 'evaluación' segura
>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31