¿Cómo se verifica en Python si una cadena contiene solo números?


129

¿Cómo verifica si una cadena contiene solo números?

Lo he probado aquí. Me gustaría ver la forma más sencilla de lograr esto.

import string

def main():
    isbn = input("Enter your 10 digit ISBN number: ")
    if len(isbn) == 10 and string.digits == True:
        print ("Works")
    else:
        print("Error, 10 digit number was not inputted and/or letters were inputted.")
        main()

if __name__ == "__main__":
    main()
    input("Press enter to exit: ")

1
Su código siempre regresará Falseya que string.digits == Truesiempre se evalúa como False.
Sukrit Kalra

1
Excepto las respuestas a continuación, una forma "no pitónica" es si [x para x en isbn si x en '0123456789']; que puede extender si el usuario coloca separadores en isbn - agréguelos a la lista
cox

1
Recomiendo usar regex si está leyendo números ISBN. Los ISBN pueden tener 10 o 13 dígitos y tienen restricciones adicionales. Hay una buena lista de comandos regex para hacerlos coincidir aquí: regexlib.com/… Muchos de estos también le permitirán leer correctamente los guiones ISBN, lo que facilitará a las personas copiar y pegar.
Kevin

1
@Kevin Y, si bien los ISBN de 13 dígitos son solo dígitos, los ISBN de 10 dígitos pueden tener X como el carácter final.
TRiG

Respuestas:


248

Querrás usar el isdigitmétodo en tu strobjeto:

if len(isbn) == 10 and isbn.isdigit():

De la isdigitdocumentación :

str.isdigit ()

Devuelve True si todos los caracteres en la cadena son dígitos y hay al menos un carácter, False en caso contrario. Los dígitos incluyen caracteres decimales y dígitos que necesitan un manejo especial, como los dígitos de superíndice de compatibilidad. Esto cubre los dígitos que no se pueden usar para formar números en la base 10, como los números de Kharosthi. Formalmente, un dígito es un carácter que tiene el valor de propiedad Numeric_Type = Digit o Numeric_Type = Decimal.


16
Vale la pena señalar que este puede no ser el cheque que realmente desea. Esto verifica que todos los caracteres tengan forma de dígitos , no que la cadena sea un número analizable. Por ejemplo, la cadena "⁰" (que es un superíndice unicode cero), pasa isdigit, pero genera un ValueErrorif si se pasa a int().
danpalmer

42

Uso str.isdigit:

>>> "12345".isdigit()
True
>>> "12345a".isdigit()
False
>>>

No tenía idea de que ese método existía. Siempre lo he hecho try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handley me sentí feo como el pecado. ¡Gracias!
Adam Smith

10

Utilice la función de cadena isdigit :

>>> s = '12345'
>>> s.isdigit()
True
>>> s = '1abc'
>>> s.isdigit()
False

3

También puedes usar la expresión regular,

import re

por ejemplo: -1) palabra = "3487954"

re.match('^[0-9]*$',word)

por ejemplo: -2) palabra = "3487.954"

re.match('^[0-9\.]*$',word)

por ejemplo: -3) palabra = "3487.954 328"

re.match('^[0-9\.\ ]*$',word)

Como puede ver los 3, por ejemplo, significa que no hay ninguno en su cadena. Para que pueda seguir las soluciones respectivas dadas con ellos.


1
re.match('^[0-9\.]*$',word)falla por flotadores. if(bool(re.search(r'\d', word)))funciona bien sin embargo.

2

¿Qué pasa con los números flotantes , números negativos , etc. Todos los ejemplos anteriores estarán equivocados?

Hasta ahora obtuve algo como esto, pero creo que podría ser mucho mejor:

'95.95'.replace('.','',1).isdigit()

solo será verdadero si hay uno o no '.' en la cadena de dígitos.

'9.5.9.5'.replace('.','',1).isdigit()

devolverá falso


Todos los ejemplos anteriores estarán equivocados. ¿No es porque la pregunta es sobre otra cosa?
AMC

2

Como se señaló en este comentario, ¿cómo verifica en Python si una cadena contiene solo números? el isdigit()método no es totalmente exacto para este caso de uso, ya que devuelve True para algunos caracteres similares a dígitos:

>>> "\u2070".isdigit() # unicode escaped 'superscript zero' 
True

Si esto debe evitarse, las siguientes funciones simples verifican si todos los caracteres de una cadena son un dígito entre "0" y "9":

import string

def contains_only_digits(s):
    # True for "", "0", "123"
    # False for "1.2", "1,2", "-1", "a", "a1"
    for ch in s:
        if not ch in string.digits:
            return False
    return True

Utilizado en el ejemplo de la pregunta:

if len(isbn) == 10 and contains_only_digits(isbn):
    print ("Works")

Es algo pequeño, pero la función se puede simplificar all(ch in string.digits for ch in s).
AMC

1

Puedes usar try catch block aquí:

s="1234"
try:
    num=int(s)
    print "S contains only digits"
except:
    print "S doesn't contain digits ONLY"

esto solo funciona con números enteros, con números flotantes siempre fallará ya que contiene un (.)
Eddwin Paz

2
Además, siempre es una mala práctica no especificar qué excepción desea manejar. En este caso debería ser:except ValueError:
J0ANMM

Sin embargo, esto no es correcto, ¿no? int("1_000")no conduce a un error, por ejemplo.
AMC

1

Como cada vez que encuentro un problema con la verificación es porque el str puede ser None a veces, y si el str puede ser None, solo usar str.isdigit () no es suficiente ya que obtendrá un error

AttributeError: el objeto 'NoneType' no tiene el atributo 'isdigit'

y luego debes validar primero que str es None o not. Para evitar una rama múltiple si, una forma clara de hacer esto es:

if str and str.isdigit():

Espero que esto ayude a las personas que tienen el mismo problema que yo.


1

Hay dos métodos en los que puedo pensar para verificar si una cadena tiene todos los dígitos de

Método 1 (Usando la función isdigit () incorporada en python): -

>>>st = '12345'
>>>st.isdigit()
True
>>>st = '1abcd'
>>>st.isdigit()
False

Método 2 (Realización de manejo de excepciones en la parte superior de la cadena): -

st="1abcd"
try:
    number=int(st)
    print("String has all digits in it")
except:
    print("String does not have all digits in it")

La salida del código anterior será:

String does not have all digits in it

Usar un desnudo excepto así es una mala práctica, ver por ejemplo ¿Qué tiene de malo usar un desnudo 'excepto'? .
AMC

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.