Wie prüft man in Python, ob eine Zeichenfolge nur Zahlen enthält?

129

Wie prüft man, ob eine Zeichenfolge nur Zahlen enthält?

Ich habe es hier versucht. Ich würde gerne den einfachsten Weg sehen, dies zu erreichen.

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: ")
Coder77
quelle
1
Ihr Code wird immer zurückgegeben, Falseda string.digits == Trueimmer ausgewertet wird False.
Sukrit Kalra
1
Mit Ausnahme der folgenden Antworten ist ein "nicht pythonischer" Weg, wenn [x für x in isbn wenn x in '0123456789']; dass Sie erweitern können, wenn der Benutzer Trennzeichen in isbn setzt - fügen Sie sie zur Liste hinzu
cox
1
Ich empfehle die Verwendung von Regex, wenn Sie ISBN-Nummern lesen. ISBNs können entweder 10 oder 13 Stellen lang sein und unterliegen zusätzlichen Einschränkungen. Hier finden Sie eine gute Liste von Regex-Befehlen, mit denen Sie sie abgleichen können: regexlib.com/… Mit vielen dieser Befehle können Sie auch die ISBN-Bindestriche korrekt lesen, was das Kopieren und Einfügen erleichtert.
Kevin
1
@ Kevin Und während 13-stellige ISBNs tatsächlich nur Ziffern sind, können 10-stellige ISBNs X als Endzeichen haben.
TRiG

Antworten:

247

Sie möchten die isdigitMethode auf Ihrem verwendenstr Objekt verwenden:

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

Aus der isdigitDokumentation :

str.isdigit ()

Geben Sie True zurück, wenn alle Zeichen in der Zeichenfolge Ziffern sind und mindestens ein Zeichen vorhanden ist, andernfalls False. Ziffern enthalten Dezimalzeichen und Ziffern, die einer besonderen Behandlung bedürfen, z. B. hochgestellte Kompatibilitätsziffern. Dies umfasst Ziffern, die nicht zur Bildung von Zahlen in Basis 10 verwendet werden können, wie die Kharosthi-Zahlen. Formal ist eine Ziffer ein Zeichen mit dem Eigenschaftswert Numeric_Type = Digit oder Numeric_Type = Decimal.

mhlester
quelle
16
Es ist erwähnenswert, dass dies möglicherweise nicht der Scheck ist, den Sie tatsächlich wollen. Diese prüft, ob alle Zeichen sind ziffern wie , nicht , dass die Zeichenfolge eine parseable Zahl ist. Zum Beispiel wird die Zeichenfolge "⁰" (das ist eine hochgestellte Unicode-Null) zwar übergeben isdigit, aber ein ValueErrorWenn ausgelöst, an das übergeben wird int().
Danpalmer
42

Verwendung str.isdigit:

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

quelle
Ich hatte keine Ahnung, dass es diese Methode gibt. Ich habe es immer getan try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handleund es fühlte sich hässlich an wie Sünde. Vielen Dank!
Adam Smith
10

Verwenden Sie die Funktion string isdigit :

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

Sie können auch den regulären Ausdruck verwenden.

import re

zB: -1) word = "3487954"

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

zB: -2) word = "3487.954"

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

zB: -3) word = "3487.954 328"

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

Wie Sie alle 3 sehen können, bedeutet zB, dass Ihre Zeichenfolge nur keine enthält. So können Sie den jeweiligen Lösungen folgen.

Devendra Bhat
quelle
1
re.match('^[0-9\.]*$',word)schlägt für Floats fehl. if(bool(re.search(r'\d', word)))funktioniert aber gut.
2

Was ist mit Float-Zahlen , negativen Zahlen usw. Alle vorherigen Beispiele sind falsch.

Bis jetzt habe ich so etwas bekommen, aber ich denke, es könnte viel besser sein:

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

wird nur dann true zurückgeben, wenn es ein oder kein '.' gibt. in der Ziffernfolge.

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

wird false zurückgeben

Joe9008
quelle
Alle vorherigen Beispiele werden falsch sein. Ist das nicht so, weil die Frage etwas anderes betrifft?
AMC
2

Wie in diesem Kommentar ausgeführt Wie überprüfen Sie in Python, ob eine Zeichenfolge nur Zahlen enthält? Die isdigit()Methode ist für diesen Anwendungsfall nicht ganz genau, da sie für einige ziffernähnliche Zeichen True zurückgibt:

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

Wenn dies vermieden werden muss, prüft die folgende einfache Funktion, ob alle Zeichen in einer Zeichenfolge eine Ziffer zwischen "0" und "9" sind:

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

Verwendet im Beispiel aus der Frage:

if len(isbn) == 10 and contains_only_digits(isbn):
    print ("Works")
mit
quelle
Es ist eine kleine Sache, aber die Funktion kann vereinfacht werden all(ch in string.digits for ch in s).
AMC
1

Sie können try catch block hier verwenden:

s="1234"
try:
    num=int(s)
    print "S contains only digits"
except:
    print "S doesn't contain digits ONLY"
Cold_Coder
quelle
Dies funktioniert nur mit ganzen Zahlen, mit Float-Zahlen wird immer fehlschlagen, da es ein (.)
Eddwin Paz
2
Darüber hinaus ist es immer eine schlechte Praxis, nicht anzugeben, welche Ausnahme Sie behandeln möchten. In diesem Fall sollte es sein:except ValueError:
J0ANMM
Das ist aber nicht richtig, nein? int("1_000")führt zum Beispiel nicht zu einem Fehler.
AMC
1

Wie jedes Mal, wenn ich auf ein Problem mit der Prüfung stoße, kann der str manchmal None sein, und wenn der str None sein kann, reicht es nicht aus, nur str.isdigit () zu verwenden, da Sie eine Fehlermeldung erhalten

AttributeError: Das Objekt 'NoneType' hat kein Attribut 'isdigit'.

und dann müssen Sie zuerst überprüfen, ob str str None ist oder nicht. Um einen Multi-If-Zweig zu vermeiden, ist dies ein klarer Weg:

if str and str.isdigit():

Ich hoffe, dies hilft Menschen, die das gleiche Problem haben wie ich.

Zhihong
quelle
1

Es gibt zwei Methoden, mit denen ich prüfen kann, ob eine Zeichenfolge alle Ziffern hat oder nicht

Methode 1 (Verwenden der integrierten Funktion isdigit () in Python): -

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

Methode 2 (Ausführen der Ausnahmebehandlung über der Zeichenfolge): -

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

Die Ausgabe des obigen Codes lautet:

String does not have all digits in it
Rahul
quelle
Die Verwendung einer nackten Ausnahme ist eine schlechte Praxis, siehe zum Beispiel. Was ist falsch an der Verwendung einer nackten Ausnahme? .
AMC