Come si fa a verificare in Python se una stringa contiene solo numeri?


129

Come si controlla se una stringa contiene solo numeri?

Ci ho provato. Mi piacerebbe vedere il modo più semplice per raggiungere questo obiettivo.

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
Il tuo codice tornerà sempre Falsepoiché string.digits == Truevaluta sempre False.
Sukrit Kalra,

1
Tranne le risposte di seguito, un modo "Non Pythonic" è if [x per x in isbn if x in '0123456789']; che puoi estendere se l'utente inserisce i separatori in isbn - aggiungili all'elenco
cox

1
Ti consiglio di usare regex se stai leggendo i numeri ISBN. I codici ISBN possono essere lunghi da 10 a 13 cifre e hanno restrizioni aggiuntive. C'è un buon elenco di comandi regex per abbinarli qui: regexlib.com/… Molti di questi ti permetteranno anche di leggere correttamente i trattini ISBN, il che renderà più facile per le persone copiare e incollare.
Kevin

1
@Kevin E, mentre i codici ISBN a 13 cifre sono effettivamente solo cifre, i codici ISBN a 10 cifre possono avere X come carattere finale.
TRiG

Risposte:


248

Ti consigliamo di utilizzare il isdigitmetodo sul tuo stroggetto:

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

Dalla isdigitdocumentazione :

str.isdigit ()

Restituisce True se tutti i caratteri nella stringa sono cifre e c'è almeno un carattere, False altrimenti. Le cifre includono caratteri decimali e cifre che richiedono una gestione speciale, come le cifre in apice della compatibilità. Include cifre che non possono essere utilizzate per formare numeri nella base 10, come i numeri di Kharosthi. Formalmente, una cifra è un carattere che ha il valore della proprietà Numeric_Type = Digit o Numeric_Type = Decimal.


16
Vale la pena notare che questo potrebbe non essere il controllo che si desidera effettivamente. Questo verifica che tutti i caratteri siano simili a cifre , non che la stringa sia un numero analizzabile. Ad esempio, la stringa "⁰" (che è un apice unicode zero), passa isdigit, ma genera un ValueErrorif passato a int().
danpalmer,

42

Utilizzare str.isdigit:

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

Non avevo idea che esistesse il metodo. L'ho sempre fatto try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handlee mi è sembrato brutto come il peccato. Grazie!
Adam Smith,

10

Utilizzare la funzione isdigit stringa :

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

3

Puoi anche usare regex,

import re

ad es .: -1) word = "3487954"

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

ad es .: -2) word = "3487.954"

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

ad es .: -3) word = "3487.954 328"

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

Come puoi vedere tutti e 3, ad esempio, significa che non c'è solo nessuno nella tua stringa. Quindi puoi seguire le rispettive soluzioni fornite con loro.


1
re.match('^[0-9\.]*$',word)fallisce per i galleggianti. if(bool(re.search(r'\d', word)))funziona bene però.

2

Che dire di numeri float , numeri negativi , ecc. Tutti gli esempi precedenti saranno sbagliati.

Fino ad ora ho avuto qualcosa del genere, ma penso che potrebbe essere molto meglio:

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

tornerà vero solo se c'è uno o nessun '.' nella stringa di cifre.

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

restituirà false


Tutti gli esempi precedenti saranno errati. Non è perché la domanda riguarda qualcos'altro?
AMC,

2

Come sottolineato in questo commento Come si fa a verificare in Python se una stringa contiene solo numeri? il isdigit()metodo non è totalmente accurato per questo caso d'uso, poiché restituisce True per alcuni caratteri simili a cifre:

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

Se questo deve essere evitato, la seguente semplice funzione verifica se tutti i caratteri in una stringa sono una cifra compresa tra "0" e "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

Usato nell'esempio dalla domanda:

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

È una cosa piccola, ma la funzione può essere semplificata all(ch in string.digits for ch in s).
AMC,

1

Puoi usare try catch block qui:

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

funziona solo con numeri interi, i numeri float falliranno sempre poiché contiene un (.)
Eddwin Paz

2
Inoltre, è sempre una cattiva pratica non specificare quale eccezione si desidera gestire. In questo caso dovrebbe essere:except ValueError:
J0ANMM,

Questo non è corretto, no? int("1_000")non porta ad un errore, per esempio.
AMC,

1

Come ogni volta che riscontro un problema con il controllo è perché lo str può essere None a volte, e se lo str può essere None, utilizzare solo str.isdigit () non è sufficiente in quanto si otterrà un errore

AttributeError: l'oggetto 'NoneType' non ha attributo 'isdigit'

e quindi devi prima confermare che str sia None o no. Per evitare un ramo multi-if, un modo chiaro per farlo è:

if str and str.isdigit():

Spero che questo aiuti per le persone che hanno lo stesso problema come me.


1

Ci sono 2 metodi che mi vengono in mente per verificare se una stringa ha tutte le cifre di no

Metodo 1 (utilizzando la funzione integrata isdigit () in Python): -

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

Metodo 2 (esecuzione della gestione delle eccezioni nella parte superiore della stringa): -

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

L'output del codice sopra sarà:

String does not have all digits in it

Usare una bare tranne che è una cattiva pratica, vedi ad esempio Cosa c'è di sbagliato nell'usare una bare 'tranne'? .
AMC,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.