isnumeric und isdecimal erkennen keine Brüche und keine negativen Werte

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Karsten Böhme
User
Beiträge: 86
Registriert: Sonntag 23. Dezember 2012, 07:54

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Karsten Böhme: üblicherweise versuchst man den String per `float` zu konvertieren und falls dies fehlschlägt, macht man das, was man bei solch einem Fehler machen will.
Karsten Böhme
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ß
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Karsten Böhme: die beiden Funktionen arbeiten auf Zeichenbasis, wie die Hilfe auch deutlich macht.
S.isdecimal() -> bool

Return True if there are only decimal characters in S,
False otherwise.
Hierbei handelt is sich um die Frage, ob die Zeichen einer Dezimalziffer oder allgemeiner irgendeiner numerischen Ziffer entsprechen.
Karsten Böhme
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 ?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Karsten Böhme: nochmal, die Funktionen prüfen Ziffern nicht Zahlen.
Karsten Böhme
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) ?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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) ?
@Karsten Böhme: Ja, float()

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 ... :(
Karsten Böhme
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 !
BlackJack

@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:

Code: Alles auswählen

In [65]: u'0Ⅵ⅝๒୩❹➁ⅻ'.isnumeric()
Out[65]: True
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.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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...?
Antworten