ValueError: invalid literal for int() with base 10 für nicht-Ziffern
Ich versuche, erstellen Sie ein einfaches Programm, das liest einen string aus 4 Zeichen, macht Sie sicher, es ist ja 4-stellig, stellt sicher, dass es keine nicht-Ziffern, dann trennt die ersten beiden Ziffern der letzten zwei und addiert Sie. Ich kann damit das alles funktioniert, aber ich habe immer noch diesen Fehler:
ValueError: invalid literal for int() with base 10:
Passiert das nur, wenn ich versuche einen string wie '456f'.
Was kann ich ändern um dies zu beheben?
Code:
s = input('please type a 4-digit integer \n')
valid = True
for c in s:
if len(s)!= 4:
valid = False
if not c.isdigit():
print (c, 'is not a valid input')
number = int(s)
firstOne = number // 100
secondOne = number % 100
sum = firstOne + secondOne
x = '/'
if valid == True:
print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))
else:
print(len(s), 'is an invalid amount of digits')
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konzentrieren wir uns auf diesen code:
Das erste, was zu sagen ist, dass die
len()
check verschoben werden soll, außerhalb des Zeichens Schleife.Den nächsten Kommentar zu machen ist, dass Sie, während Sie die Entdeckung der nicht-Ziffern, Sie weiterhin ausführen von code, als ob nichts falsch ist. Sie vermutlich wollen
valid
zuFalse
.Nun, der hauptsächliche Teil des Problems. Sie müssen, überspringen Sie die Umstellung auf
int
wenn ungültige Eingabe erkannt wird.Wenn Sie möchten weiterhin mit einem solchen Ansatz würde der code wie folgt Aussehen:
Having said all das, ich würde wahrscheinlich die Neuorganisation der code ganz ein bisschen auf den Umgang mit den Fehler, sobald Sie erkannt werden. Code viel einfacher zu verstehen, wenn Sie können, organisieren Sie Ihre Fehlerbehandlung so.
Nun, das ist ein Anfang in die richtige Richtung, aber Sie können weiterhin in diesem Sinne macht den code besser und besser. Sven ' s Antwort bietet Ihnen ein hervorragendes Beispiel, wo ein solcher Prozess würde letztlich dazu führen.
if
basierte Fehlerbehandlung.Prüfen Sie, ob alle Zeichen sind Ziffern, aber diese Prüfung hat keine Folgen -- Sie nur tragen auf selbst wenn Sie gefunden ungültige Zeichen. Dies macht den code-Fehler mit der zitierten Fehlermeldung.
Ich würde vorschlagen, die Verwendung eines dedizierten Funktion zum Lesen der Ganzzahl, die wiederholt die Abfrage, bis es einen gültigen Eingang:
Beachten Sie, dass ich verwendet
str.strip()
zum entfernen von führenden oder nachfolgenden whitepsace und dassstr.isdigit()
prüft ob alle Zeichen des Strings zahlen sind-Sie brauchen nicht, um eine Schleife über den string.Was
oder noch besser (danke, Sven!)
all(c.isdigit() for c in s)
ists.isdigit()
.In der für die Prüfungen für isdigit , drucken Sie eine Fehlermeldung, wenn der string enthält nicht-Ziffern aber immer noch call for int() für alle s
Sie benötigen, um das Programm zu beenden, nachdem "keine gültige Eingabe" Nachricht
können Sie ändern Sie den Druck auf