¿Cómo puedo verificar si la entrada de cadena es un número?

5 minutos de lectura

Avatar de usuario de Trufa
Trufa

¿Cómo verifico si la entrada de cadena de un usuario es un número (por ejemplo, -1, 0, 1etc.)?

user_input = input("Enter something:")

if type(user_input) == int:
    print("Is a number")
else:
    print("Not a number")

Lo anterior no funcionará desde input siempre devuelve una cadena.

  • No sé si en “la entrada siempre devuelve cadenas”, “devuelve” es correcto.

    – Trufa

    24 de marzo de 2011 a las 19:56

  • parece que estás usando python 3.x en cuyo caso sí input siempre devuelve cadenas. Ver: docs.python.org/release/3.1.3/library/functions.html#input

    – Daniel Di Paolo

    24 de marzo de 2011 a las 19:57

  • @DanielDiPaolo: Ah, sí, soy consciente de eso, de ahí la pregunta, simplemente no sabía si la palabra devolución era correcta.

    – Trufa

    24/03/2011 a las 20:00

  • ¡Ah, entonces sí, el término “devoluciones” es precisamente el término correcto!

    – Daniel Di Paolo

    24 de marzo de 2011 a las 20:02

  • @Trufa if type(eval(user_input)) == int: esto podría funcionar

    – R__raki__

    3 de febrero de 2016 a las 7:01

Avatar de usuario de Daniel DiPaolo
daniel dipaolo

Simplemente intente convertirlo a un int y luego retírelo si no funciona.

try:
    val = int(userInput)
except ValueError:
    print("That's not an int!")

Ver Manejo de excepciones en el tutorial oficial.

  • usar val = int(str(userInput)) si solo desea valores enteros, no flotantes

    – maxkoryukov

    5 de junio de 2017 a las 23:21


  • Esto tampoco funcionará para Boolean como int(True) == 1 y int(False) == 0

    – Loïc Faure-Lacroix

    23 abr 2021 a las 20:38


avatar de usuario de jmichalicek
jmichalicek

Aparentemente, esto no funcionará para valores negativos, pero sí para números positivos.

Usar isdigit()

if userinput.isdigit():
    #do stuff

  • “-1”.isdigit() == Falso

    – Por lotesX

    24 de marzo de 2011 a las 19:55

  • No lo creo, Llopis. Me apresuré a responder preguntas antes de saber lo suficiente cuando di esta respuesta. Haría lo mismo que la respuesta de Daniel DiPaolo para el int, pero usaría float() en lugar de int().

    – jmichalicek

    08/01/2014 a las 18:50

  • Los números negativos y flotantes devuelven falso porque ‘-‘ y ‘.’ no son dígitos. La función isdigit() verifica si cada carácter en la cadena está entre ‘0’ y ‘9’.

    – Carlos H.

    14 de abril de 2015 a las 9:58

  • Usar isdecimal no isdigit porque isdigit es una prueba insegura que reconoce caracteres como unicode power-of-2, ², como un dígito que no se puede convertir a números enteros.

    – Dave Rove

    16 de julio de 2020 a las 11:45


Avatar de usuario de Andrés Fernández
Andrés Fernández

El método isnumeric() hará el trabajo:

>>>a="123"
>>>a.isnumeric()
True

Pero recuerda:

>>>a="-1"
>>>a.isnumeric()
False

isnumeric() devoluciones True si todo los caracteres de la cadena son caracteres numéricos y hay al menos un carácter.

Por lo que no se aceptan números negativos.

  • Vale la pena señalar que en Python 2.7 esto solo funciona para cadenas Unicode. Una cadena no Unicode ("123456".isnumeric()) rendimientos AttributeError: 'str' object has no attribute 'isnumeric'mientras U"12345".numeric() = True

    – regocijarse

    14 de febrero de 2017 a las 9:21


  • Además, hay algunos casos extremos en los que esto no funciona. Llevar a = '\U0001f10a'. a.isnumeric() es cierto, pero int(a) genera un ValueError.

    – Artyer

    17 de julio de 2017 a las 22:14

  • '3.3'.isnumeric() es False

    – Deqing

    23 de enero de 2018 a las 0:08

Avatar de usuario de RazorX
RazorX

Para Python 3 funcionará lo siguiente.

userInput = 0
while True:
  try:
     userInput = int(input("Enter something: "))       
  except ValueError:
     print("Not an integer!")
     continue
  else:
     print("Yes an integer!")
     break 

avatar de usuario de karthik27
karthik27

EDITADO: también puede usar este código a continuación para averiguar si es un número o también un negativo

import re
num_format = re.compile("^[\-]?[1-9][0-9]*\.?[0-9]+$")
isnumber = re.match(num_format,givennumber)
if isnumber:
    print "given string is number"

también puede cambiar su formato según sus requisitos específicos. Estoy viendo esta publicación demasiado tarde, pero espero que esto ayude a otras personas que buscan respuestas :). avíseme si algo está mal en el código dado.

  • Esto verificará si hay un número (flotante, int, etc.) dentro de la cadena. Sin embargo, si hay algo más que el valor numérico, aún devolverá un resultado. Por ejemplo: “1,2 Gbps” devolverá un falso positivo. Esto puede o no ser útil para algunas personas.

    -Brian Bruggeman

    28 mayo 2015 a las 19:35

  • También tenga en cuenta: para cualquiera que esté buscando, mi comentario original ya no es válido. 😛 ¡Gracias por la actualización @karthik27!

    -Brian Bruggeman

    24/08/2015 a las 14:30

Avatar de usuario de Leonardo
leonardo

Si necesita específicamente un int o float, puede probar “is not int” o “is not float”:

user_input=""
while user_input is not int:
    try:
        user_input = int(input('Enter a number: '))
        break
    except ValueError:
        print('Please enter a valid number: ')

print('You entered {}'.format(user_input))

Si solo necesita trabajar con enteros, entonces la solución más elegante que he visto es el método “.isdigit()”:

a=""
while a.isdigit() == False:
    a = input('Enter a number: ')

print('You entered {}'.format(a))

  • Esto verificará si hay un número (flotante, int, etc.) dentro de la cadena. Sin embargo, si hay algo más que el valor numérico, aún devolverá un resultado. Por ejemplo: “1,2 Gbps” devolverá un falso positivo. Esto puede o no ser útil para algunas personas.

    -Brian Bruggeman

    28 mayo 2015 a las 19:35

  • También tenga en cuenta: para cualquiera que esté buscando, mi comentario original ya no es válido. 😛 ¡Gracias por la actualización @karthik27!

    -Brian Bruggeman

    24/08/2015 a las 14:30

Funciona bien para comprobar si un aporte es un entero positivo Y en un rango específico

def checkIntValue():
    '''Works fine for check if an **input** is
   a positive Integer AND in a specific range'''
    maxValue = 20
    while True:
        try:
            intTarget = int(input('Your number ?'))
        except ValueError:
            continue
        else:
            if intTarget < 1 or intTarget > maxValue:
                continue
            else:
                return (intTarget)

¿Ha sido útil esta solución?