2009-05-20 9 views
4

Ich versuche zu bewerten, ob die Zeichenfolge in einem der Textfelder meiner Schnittstelle eine Nummer ist (d. H. Kein Text oder irgendetwas anderes). In Python gibt es eine Methode namens isdigit(), die True zurückgibt, wenn die Zeichenfolge nur Ziffern enthält (keine negativen Vorzeichen oder Dezimalpunkte). Gibt es eine andere Möglichkeit, um zu beurteilen, ob meine Zeichenfolge eine rationale Zahl ist (Beispiel: 1,25).isDigit() für rationale Zahlen?

Beispielcode:

if self.components.txtZoomPos.text.isdigit(): 
     step = int(self.components.txtZoomPos.text) 

Antwort

5

1,25 ist eine Notation, die üblicherweise für reals verwendet wird, weniger für rational numbers. Pythons float wird eine ValueError auslösen, wenn die Konvertierung fehlschlägt. Also:

def isReal(txt): 
    try: 
     float(txt) 
     return True 
    except ValueError: 
     return False 
+0

Nein, es ist beides, wenn Sie nach den Standard-Mathematiknamen gehen. Die reelle Zahlenzeile besteht aus den rationalen Zahlen und irrationalen Zahlen, die rationale Zahlenzeile sind die ganzen Zahlen und Zahlen, die in der Form 'a/b' dargestellt werden können, wobei a und b ganze Zahlen sind. – workmad3

+0

@ workmad3: Du hast Recht, weshalb ich meine Antwort schnell aktualisiert habe (aber leider, nachdem du sie gesehen hast;)) – Stephan202

+0

+1, ich habe gerade die gleiche Sache eingegeben, als deine Antwort erschien. Verdammt! Verpasste die Rep-Punkte! – PTBNL

0

int() oder Schwimmer() throws Valueerror wenn das Literal nicht gültig ist

0

float() eine ValueError wirft, wenn die Umwandlung nicht. Versuchen Sie also, Ihre Zeichenfolge in einen Float zu konvertieren und fangen Sie die ValueError.

1

try/catch ist sehr billig in Python, und ein float aus einem String zu erstellen versuchen, das keine Zahl ist eine Ausnahme auslöst:

>>> float('1.45') 
1.45 
>>> float('foo') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for float(): foo 

Sie können genauso wie etwas zu tun:

try: 
    # validate it's a float 
    value = float(self.components.txtZoomPos.text) 
except ValueError, ve: 
    pass # your error handling goes here 
1

Die vorhandenen Antworten sind richtig, dass der pythonischere Weg normalerweise zu try...except (dh EAFP) ist .

Wenn Sie jedoch wirklich die Validierung durchführen möchten, können Sie genau 1 Dezimalpunkt entfernen, bevor Sie isdigit() verwenden.

>>> "124".replace(".", "", 1).isdigit() 
True 
>>> "12.4".replace(".", "", 1).isdigit() 
True 
>>> "12..4".replace(".", "", 1).isdigit() 
False 
>>> "192.168.1.1".replace(".", "", 1).isdigit() 
False 

Beachten Sie, dass dies Floats nicht anders als Ints behandelt. Sie können diese Überprüfung hinzufügen, wenn Sie es wirklich brauchen.