Diese Antwort bietet Schritt für Schritt Anleitung mit Funktion mit Beispielen zu finden, die Zeichenfolge ist:
- Positive Ganzzahl
- Positiv/negativ - Ganzzahl/Fließkomma
- Wie zu verwerfen "NaN" (nicht eine Zahl) Zeichenfolgen bei der Überprüfung auf Zahl?
Prüfen Sie, ob die Zeichenkette positiv Ganzzahl
Sie können verwenden str.isdigit()
um zu prüfen, ob die angegebene Zeichenkette positiv Ganzzahlig.
Ergebnisse der Stichprobe:
# For digit
>>> '1'.isdigit()
True
>>> '1'.isalpha()
False
Prüfung auf String als positiv/negativ - Integer/Float
str.isdigit()
gibt zurück. False
wenn die Zeichenkette eine negativ Zahl oder eine Float-Zahl. Zum Beispiel:
# returns `False` for float
>>> '123.3'.isdigit()
False
# returns `False` for negative number
>>> '-123'.isdigit()
False
Wenn Sie möchten, dass Prüfen Sie auch, ob die negativ ganze Zahlen und float
dann können Sie eine benutzerdefinierte Funktion schreiben, um dies zu überprüfen:
def is_number(n):
try:
float(n) # Type-casting the string to `float`.
# If string is not a valid `float`,
# it'll raise `ValueError` exception
except ValueError:
return False
return True
Musterlauf:
>>> is_number('123') # positive integer number
True
>>> is_number('123.4') # positive float number
True
>>> is_number('-123') # negative integer number
True
>>> is_number('-123.4') # negative `float` number
True
>>> is_number('abc') # `False` for "some random" string
False
Verwerfen von "NaN"-Strings (keine Zahl) bei der Prüfung auf Zahl
Die oben genannten Funktionen liefern True
für die Zeichenkette "NAN" (Not a number), da sie für Python als Float gilt und keine Zahl darstellt. Zum Beispiel:
>>> is_number('NaN')
True
Um zu prüfen, ob die Zahl "NaN" ist, können Sie Folgendes verwenden math.isnan()
als:
>>> import math
>>> nan_num = float('nan')
>>> math.isnan(nan_num)
True
Wenn Sie keine zusätzliche Bibliothek importieren möchten, um dies zu überprüfen, können Sie es auch einfach durch einen Vergleich mit sich selbst überprüfen, indem Sie ==
. Python gibt zurück False
wenn nan
float wird mit sich selbst verglichen. Zum Beispiel:
# `nan_num` variable is taken from above example
>>> nan_num == nan_num
False
Daher wird oben Funktion is_number
kann aktualisiert werden und liefert False
para "NaN"
als:
def is_number(n):
is_number = True
try:
num = float(n)
# check for "nan" floats
is_number = num == num # or use `math.isnan(num)`
except ValueError:
is_number = False
return is_number
Musterlauf:
>>> is_number('Nan') # not a number "Nan" string
False
>>> is_number('nan') # not a number string "nan" with all lower cased
False
>>> is_number('123') # positive integer
True
>>> is_number('-123') # negative integer
True
>>> is_number('-1.12') # negative `float`
True
>>> is_number('abc') # "some random" string
False
_PS: Jeder Vorgang für jede Prüfung, je nach Art der Nummer, ist mit zusätzlichem Overhead verbunden. Wählen Sie die Version von is_number
Funktion, die Ihren Anforderungen entspricht._
101 Stimmen
Was ist falsch an Ihrer derzeitigen Lösung? Sie ist kurz, schnell und lesbar.
7 Stimmen
Und Sie müssen nicht nur True oder False zurückgeben. Sie können stattdessen den Wert entsprechend modifiziert zurückgeben - zum Beispiel könnten Sie dies verwenden, um Nicht-Zahlen in Anführungszeichen zu setzen.
10 Stimmen
Wäre es nicht besser, im Falle einer erfolgreichen Konvertierung das Ergebnis von float(s) zurückzugeben? Sie haben immer noch die Erfolgsprüfung (Ergebnis ist False) und Sie haben die Umwandlung, die Sie wahrscheinlich sowieso wollen.
0 Stimmen
Thruston - Ich verstehe, was Sie meinen, aber dann ist die Prüfung nicht mehr so einfach.
12 Stimmen
Auch wenn diese Frage schon älter ist, wollte ich nur sagen, dass dies ein eleganter Weg ist, der dokumentiert ist als EAFP . Das ist wahrscheinlich die beste Lösung für diese Art von Problem.
2 Stimmen
Das scheint in Ordnung zu sein, es sei denn, Sie validieren die Eingaben eines Benutzers, da locale.atoi("0,1,00") 100.... ergibt.
0 Stimmen
Sehr nützliche Funktion. Darüber hinaus, wenn Sie Raum, wie 1e + 2, etc. zulassen wollen, dann muss diese Funktion geändert werden.
0 Stimmen
Wenn Sie nicht wissen, ob es sich bei dem Eingabewert um eine Zeichenkette handelt, können Sie auch einen TypeError
2 Stimmen
pythoncentral.io/ würde helfen.
0 Stimmen
Gibt das Ergebnis von
float(s)
bei Erfolg, oderNone
, bei Fail. Dann erhalten Sie das True/False-Verhalten und können das Ergebnis direkt verwenden.0 Stimmen
Verwandt: Float/Double-Wert extrahieren
10 Stimmen
Nicht gibt das Ergebnis von float(s) oder None bei Fail zurück. Wenn Sie es dann als
x = float('0.00'); if x: use_float(x);
haben Sie jetzt einen Fehler in Ihrem Code. Wahrheitsgemäße Werte sind der Grund dafür, dass diese Funktionen eine Ausnahme auslösen und nicht zurückgebenNone
an erster Stelle. Eine bessere Lösung ist es, die Hilfsfunktion zu vermeiden und den Aufruf von float in einetry catch
wenn Sie es benutzen wollen.0 Stimmen
Dies ist ein Teil des Problems, das in dem Beitrag stackoverflow.com/questions/36903462/adding-numbers-in-a-string/
4 Stimmen
Achtung: Das Snippet sagt aus, dass jede Objekt, das automatisch wirft zu float ist eine Zahl, und das könnte irreführend sein. Zum Beispiel kann eine einfache bool ist eine Zahl, da float(True) eine gültige 1,0 zurückgibt.
0 Stimmen
Nicht langsam. int(s) oder float(s) ist wahrscheinlich fast so schnell wie das, was der Python-Interpreter für solche Dinge verwendet und kann sogar etwas C-Code darunter haben. In [17]: time_it(int, '333', count=1) Out[17]: 4.0531158447265625e-06 Ziemlich schnell.
0 Stimmen
Wahrscheinlich möchten Sie den ValueError-Teil loswerden, da dieser sonst eine Ausnahme auslöst, wenn er eine Liste / ein Diktat als Eingabe erhält
0 Stimmen
@Colonel Panic es ist auch langsam
2 Stimmen
Der langsame Teil ist NICHT der Float(a). Der langsame Teil ist die Ausnahme throw/catch. Wie jeder gute Programmierer weiß: VERWENDEN SIE NIEMALS AUSNAHMEN FÜR DEN NORMALEN CODE-WEG. Der OP hat das nicht spezifiziert, also denke ich, dass wir davon ausgehen sollten, dass nicht-numerische Eingaben "normal" für diese Funktion sind. Ist es in Python üblich, Ausnahmen als Teil des normalen Codeflusses zu verwenden? @SamanthaAtkins
0 Stimmen
Warum nicht folgen lazy Überprüfung Muster? davon ausgehen, dass das Objekt ein Float ist und versuchen Sie die Operation und fangen eine Ausnahme, protokollieren Sie es und dann gießen Sie es zu Float und reattempt.