¿Cómo analizo una cadena en flotante o int?

Resuelto Tristan Havelick asked hace 15 años • 33 respuestas

¿Cómo puedo convertir un stra float?

"545.2222" -> 545.2222

¿O una stra 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.

Tristan Havelick avatar Dec 19 '08 08:12 Tristan Havelick
Aceptado
>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545
Harley Holcombe avatar Dec 19 '2008 01:12 Harley Holcombe

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.

Eric Leschinski avatar Jan 05 '2014 04:01 Eric Leschinski
def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)
Javier avatar Dec 19 '2008 02:12 Javier

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
wim avatar Mar 01 '2012 04:03 wim