Hallo miteinander,
nur mal ne kurze Frage. Ich wollte einen String vor der Weiterverarbeitung darauf testen, ob er einen numerischen Wert enthält. Dabei sollte es egal sein ob es sich um ein Integer oder ein Float handelt. Musste allerdings feststellen, dass sowohl sowohl isnumeric als auch isdecimal weder negative noch Zahlen mit Nachkommaanteil erkennen. Bietet die Standard-Lib keine solche, an und für sich "gängige", Funktion ?
Gruß
Karsten
isnumeric und isdecimal erkennen keine Brüche und keine negativen Werte
-
- User
- Beiträge: 86
- Registriert: Sonntag 23. Dezember 2012, 07:54
@Sirius3 : ja, das ist ne Möglichkeit. Sind aber wieder mehr Zeilen. Und ganz allgemein, wenn eine Funktion mit dem Namen isnumeric bei einem Wert von bspw. u'-12,34' False zurück gibt dann verstehe ich den Sinn der Funktion nicht. Wenn ich Dich richtig verstehe gibt es also keine Funktion die das erschlägt ?
Gruß
Gruß
@Karsten Böhme: die beiden Funktionen arbeiten auf Zeichenbasis, wie die Hilfe auch deutlich macht.
Hierbei handelt is sich um die Frage, ob die Zeichen einer Dezimalziffer oder allgemeiner irgendeiner numerischen Ziffer entsprechen.S.isdecimal() -> bool
Return True if there are only decimal characters in S,
False otherwise.
-
- User
- Beiträge: 86
- Registriert: Sonntag 23. Dezember 2012, 07:54
@Sirius3 : ja, die Basis bildet ein String, also eine Zeichenkette. Trotzdem ist u'-12.34' Numeric reinsten Wassers. Oder etwa nicht ?
-
- User
- Beiträge: 86
- Registriert: Sonntag 23. Dezember 2012, 07:54
@Sirius3 : ja, habe ich schon verstanden. Zurück zu meiner Frage, gibt es eine Funktion welche einen String auf einen numerischen Wert prüft (und nicht nur auf eine Folge der Ziffern 0..9) ?
@Karsten Böhme: Ja, float()Karsten Böhme hat geschrieben:Zurück zu meiner Frage, gibt es eine Funktion welche einen String auf einen numerischen Wert prüft (und nicht nur auf eine Folge der Ziffern 0..9) ?
Code: Alles auswählen
def isfloat(s):
try:
float(s)
return True
except:
return False
if isfloat(s) is True:
num = float(s)
Ganz im Ernst: sowas habe ich schon in der Praxis gesehen ...
-
- User
- Beiträge: 86
- Registriert: Sonntag 23. Dezember 2012, 07:54
Danke ! float ist mir bekannt, wandelt aber um und ist wieder mit ner exception verbunden. Also so etwas wie isnumeric , was nur testet und dann True oder False zurück gibt (aber eben wirklich für numerische Ausdrücke) ist anscheinend nicht vorhanden. Vielen Dank für eure Antworten !
@Karsten Böhme: Um auf eine Zeichenkette zu prüfen ob sie eine (gültige) Gleitkommazahldarstellung ist muss man letztendlich fast so viel Arbeit verrichten wie nötig ist um sie tatsächlich umzuwandeln. Deshalb macht so eine Funktion nicht viel Sinn wenn `float()` das schon leistet. Und es kommt dann auch noch recht selten vor das man die Zeichenkette testen will und sie dann aber *nicht* auch umwandeln will, also macht das noch weniger Sinn. Auch wenn ich leider auch schon solchen Unsinn gesehen habe wie Sirius3 ihn gezeigt hat.
Die `isnumeric()`- und `isdecimal()`-Methoden prüfen wie gesagt auf Zeichenebene ob das oder die Zeichen alle zu der jeweiligen Klasse gehören. `isnumeric()` gibt zum Beispiel auch bei Ziffernzeichen aus anderen Schriften wahr zurück und bei Ziffernzeichen in Kreisen, speziellen mathematischen Ziffern, und bei römischen, arabischen, begalischen, tamilischen, tibetanischen, … Ziffernzeichen und was es da sonst noch so alles in Unicode gibt was zu der Klasse gehört. Also zum Beispiel diese acht Zeichen:
Die Zeichen noch mal in etwas grösser und durch Kommas getrennt: 0, Ⅵ, ⅝, ๒, ୩, ❹, ➁, ⅻ. Die Funktion hat also wirklich so überhaupt nichts mit dem zu tun was Du haben willst.
Die `isnumeric()`- und `isdecimal()`-Methoden prüfen wie gesagt auf Zeichenebene ob das oder die Zeichen alle zu der jeweiligen Klasse gehören. `isnumeric()` gibt zum Beispiel auch bei Ziffernzeichen aus anderen Schriften wahr zurück und bei Ziffernzeichen in Kreisen, speziellen mathematischen Ziffern, und bei römischen, arabischen, begalischen, tamilischen, tibetanischen, … Ziffernzeichen und was es da sonst noch so alles in Unicode gibt was zu der Klasse gehört. Also zum Beispiel diese acht Zeichen:
Code: Alles auswählen
In [65]: u'0Ⅵ⅝๒୩❹➁ⅻ'.isnumeric()
Out[65]: True
Um dies mal aufzugreifen und auch mit Blick auf den Threadersteller: Was passiert denn, wenn erkannt wurde, dasss der String eine Zahl ist? Spielt die Zahl, die durch den String repräsentiert wird, im weiteren Verlauf keine Rolle mehr...?BlackJack hat geschrieben:Und es kommt dann auch noch recht selten vor das man die Zeichenkette testen will und sie dann aber *nicht* auch umwandeln will, also macht das noch weniger Sinn.