1976 Stimmen

Wie prüfe ich, ob eine Zeichenkette eine Zahl (Float) ist?

Wie kann man am besten prüfen, ob eine Zeichenkette in Python als Zahl dargestellt werden kann?

Die Funktion, die ich derzeit habe, ist:

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

Das ist nicht nur hässlich und langsam, sondern wirkt auch klobig. Ich habe jedoch keine bessere Methode gefunden, da der Aufruf von float() in der Hauptfunktion ist noch schlimmer.

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.

15voto

Evan Plaice Punkte 13682

Einfach C# imitieren

In C# gibt es zwei verschiedene Funktionen, die das Parsen von skalaren Werten übernehmen:

  • Float.Parse()
  • Float.TryParse()

float.parse():

def parse(string):
    try:
        return float(string)
    except Exception:
        throw TypeError

Hinweis: Falls Sie sich fragen, warum ich die Ausnahme in einen TypeError geändert habe, Hier ist die Dokumentation .

float.try_parse():

def try_parse(string, fail=None):
    try:
        return float(string)
    except Exception:
        return fail;

Hinweis: Sie sollten nicht den booleschen Wert "False" zurückgeben, da dies immer noch ein Werttyp ist. None ist besser, weil es einen Fehler anzeigt. Wenn Sie etwas anderes wollen, können Sie den Parameter "fail" natürlich in den gewünschten Wert ändern.

Um float um die Methoden 'parse()' und 'try_parse()' zu erweitern, müssen Sie die Klasse 'float' mit einem Monkeypatch versehen, um diese Methoden hinzuzufügen.

Wenn Sie bereits existierende Funktionen respektieren wollen, sollte der Code etwa so aussehen:

def monkey_patch():
    if(!hasattr(float, 'parse')):
        float.parse = parse
    if(!hasattr(float, 'try_parse')):
        float.try_parse = try_parse

Nebenbemerkung: Ich persönlich ziehe es vor, es Monkey Punching zu nennen, weil es sich anfühlt, als würde ich die Sprache missbrauchen, wenn ich das tue, aber das ist Geschmackssache.

Verwendung:

float.parse('giggity') // throws TypeException
float.parse('54.3') // returns the scalar value 54.3
float.tryParse('twank') // returns None
float.tryParse('32.2') // returns the scalar value 32.2

Und der große Weise Pythonas sagte zum Heiligen Sharpisus: "Alles, was du kannst, kann ich besser; ich kann alles besser machen als du."

0 Stimmen

Ich habe in letzter Zeit hauptsächlich in JS kodiert und habe dies nicht wirklich getestet, daher kann es einige kleinere Fehler geben. Wenn Sie irgendwelche sehen, fühlen Sie sich frei, meine Fehler zu korrigieren.

0 Stimmen

Um Unterstützung für komplexe Zahlen hinzuzufügen, siehe die Antwort von @Matthew Wilcoxson. stackoverflow.com/a/3335060/290340 .

1 Stimmen

Verwendung von ! anstelle von not könnte ein kleiner Fehler sein, aber Sie können definitiv keine Attribute an die integrierte float in CPython.

15voto

Aruthawolf Punkte 271

Ich weiß, dass diese Frage besonders alt ist, aber ich möchte eine Antwort hinzufügen, von der ich glaube, dass sie die Informationen abdeckt, die in der am höchsten bewerteten Antwort fehlen, und die für alle, die sie finden, sehr wertvoll sein könnte:

Verbinden Sie jede der folgenden Methoden mit einer Zählung, wenn Sie eine Eingabe akzeptieren müssen. (Unter der Annahme, dass wir vokale Definitionen von Ganzzahlen verwenden und nicht 0-255 usw.)

x.isdigit() funktioniert gut, um zu prüfen, ob x eine ganze Zahl ist.

x.replace('-','').isdigit() funktioniert gut, um zu prüfen, ob x negativ ist (Prüfung - an erster Stelle).

x.replace('.','').isdigit() funktioniert gut, um zu prüfen, ob x eine Dezimalzahl ist.

x.replace(':','').isdigit() funktioniert gut, um zu prüfen, ob x ein Verhältnis ist.

x.replace('/','',1).isdigit() funktioniert gut, um zu prüfen, ob x ein Bruch ist.

3 Stimmen

Für Brüche müssen Sie jedoch wahrscheinlich x.replace('/','',1).isdigit() sonst würden Daten wie 4/7/2017 fälschlicherweise als Zahlen interpretiert werden.

0 Stimmen

Für die besten Möglichkeiten zur Verkettung der Bedingungen: stackoverflow.com/q/3411771/5922329

12voto

codelogic Punkte 68703

Casting zu float und Abfangen von ValueError ist wahrscheinlich der schnellste Weg, da float() speziell für genau das gedacht ist. Alles andere, das String-Parsing (Regex, etc.) erfordert wird wahrscheinlich langsamer aufgrund der Tatsache, dass es nicht für diese Operation abgestimmt ist. Meine $0,02.

12 Stimmen

Ihre "2e-2" Dollar sind ebenfalls ein Float (ein weiteres Argument für die Verwendung von Float :)

9 Stimmen

@tzot Verwenden Sie NIEMALS einen Float, um einen Geldwert darzustellen.

6 Stimmen

@Luke: Ich stimme Ihnen vollkommen zu, obwohl ich nie vorgeschlagen habe, Floats zur Darstellung von Geldwerten zu verwenden; ich habe nur gesagt, dass Geldwerte puede als Gleitkommazahlen dargestellt werden :)

12voto

Blackzafiro Punkte 215

Sie können Unicode-Zeichenfolgen verwenden, sie haben eine Methode, um genau das zu tun, was Sie wollen:

>>> s = u"345"
>>> s.isnumeric()
True

Oder:

>>> s = "345"
>>> u = unicode(s)
>>> u.isnumeric()
True

http://www.tutorialspoint.com/python/string_isnumeric.htm

http://docs.python.org/2/howto/unicode.html

2 Stimmen

Für nicht-negative Zahlen ist es ok ;-)

1 Stimmen

s.isdecimal() prüft, ob s string ist eine nichtnegative ganze Zahl. s.isnumeric() enthält Zeichen, die int() ablehnt.

10voto

Siddharth Satpathy Punkte 2433

Im allgemeinsten Fall für einen Float möchte man sich um ganze Zahlen und Dezimalzahlen kümmern. Nehmen wir die Zeichenkette "1.1" als Beispiel.

Ich würde eine der folgenden Möglichkeiten ausprobieren:

1.> isnumerisch()

word = "1.1"

"".join(word.split(".")).isnumeric()
>>> True

2.> isdigit()

word = "1.1"

"".join(word.split(".")).isdigit()
>>> True

3.> isdecimal()

word = "1.1"

"".join(word.split(".")).isdecimal()
>>> True

Geschwindigkeit:

Alle vorgenannten Methoden haben ähnliche Geschwindigkeiten.

%timeit "".join(word.split(".")).isnumeric()
>>> 257 ns ± 12 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit "".join(word.split(".")).isdigit()
>>> 252 ns ± 11 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit "".join(word.split(".")).isdecimal()
>>> 244 ns ± 7.17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

1 Stimmen

In all diesen Beispielen prüfen Sie, ob 11 eine Zahl ist, nicht 1,1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X