isNumeric (alle OS, Anfänger-Tip)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

isNumeric (alle OS, Anfänger-Tip)

Beitrag von Tommy »

Code: Alles auswählen

;(c) Tommy
Procedure isNumeric(String.s)
String = ReplaceString(String, ",", ".")
ProcedureReturn Bool(Abs(ValF(String)) > 0 Or Abs(Val(String)) > 0 Or String = "0")
EndProcedure
Debug isNumeric("A123")
Debug isNumeric("123")
Debug isNumeric("123.456")
Debug isNumeric("123,456")
Debug isNumeric("$FF")
Debug isNumeric("-123")
Debug isNumeric("1.7e-6")
Debug isNumeric("%101")
Debug isNumeric("")
Debug isNumeric("0")
Zuletzt geändert von Tommy am 26.01.2015 14:53, insgesamt 5-mal geändert.
PB 5.41 x64
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: isNumeric

Beitrag von Nino »

Code: Alles auswählen

Procedure isNumeric(String.s)
   If String = Str(Val(String))
      ProcedureReturn 1
   Else
      ProcedureReturn 0
   EndIf
EndProcedure

Debug IsNumeric("1.23")  ; -> 0 (falsch)
Debug IsNumeric("$FF")   ; -> 0 (falsch)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: isNumeric

Beitrag von NicTheQuick »

Hier auch ein älterer Thread mit dem selben Titel: isNumeric.
Die Funktion kommt auch mit Fließkommazahlen zurecht, aber noch nicht mit Schreibweisen wie '$ff' oder '%10010'. Vielleicht könnte man ja da ansetzen.
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: isNumeric

Beitrag von Nino »

NicTheQuick hat geschrieben:Vielleicht könnte man ja da ansetzen.
Das folgende ist "etwas" kürzer :-) und kommt auch mit $FF u.ä. zurecht.

Code: Alles auswählen

Macro IsNumeric(string)
   Bool(string <> "" And (Val(string) <> Val(string+"1") Or ValF(string) <> ValD(string+"1")))
EndMacro

; ===  Test  ===
; Folgendes liefert 1:
Debug IsNumeric("-12")   
Debug IsNumeric("0")     
Debug IsNumeric("123")   
Debug IsNumeric("-1.2")  
Debug IsNumeric("0.0")    
Debug IsNumeric("1.23")   
Debug IsNumeric("$FF")    
Debug IsNumeric("%101")   
Debug IsNumeric("1.7e-6") 
Debug IsNumeric("1.2345678901234567") 
Debug ""
; Folgendes liefert 0:
Debug IsNumeric("12c")    
Debug IsNumeric("abc")    
Debug IsNumeric("")
Zuletzt geändert von Nino am 24.01.2015 20:36, insgesamt 1-mal geändert.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: isNumeric

Beitrag von Tommy »

Thx für die Hinweise und Mithilfe.
An die Sachen habe ich nich dran gedacht. :oops:
@Nino
Dein Code sagt bei "5,5" > 0
Ich habe mein Code verbessert und kommt auch mit "5,5" zurecht:
Code siehe oben
Zuletzt geändert von Tommy am 26.01.2015 14:53, insgesamt 2-mal geändert.
PB 5.41 x64
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: isNumeric

Beitrag von Nino »

Tommy hat geschrieben:@Nino
Dein Code sagt bei "5,5" > 0
Das ist auch so beabsichtigt, denn 5,5 ist in PB keine gültige Zahl.

Tommy hat geschrieben:

Code: Alles auswählen

;(c) Tommy

Procedure isNumeric(String.s)
  String = ReplaceString(String, ",", ".")
  ProcedureReturn Bool(Abs(ValF(String)) > 0 Or Abs(Val(String)) > 0)
EndProcedure
Hast Du mit diesem Code schonmal folgendes probiert? :D

Code: Alles auswählen

Debug Isnumeric("-3")
Ehrlich gesagt würde ich von einem "Tipp oder Trick" doch erwarten, dass er stärker ausgereift ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: isNumeric

Beitrag von NicTheQuick »

Aber jetzt kommt er nicht mehr mit 0 zurecht. ;)

Code: Alles auswählen

Debug isNumeric("0")
Bild
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: isNumeric

Beitrag von Tommy »

5,5 is aber in der Mathematik trotzdem eine gültige Zahl.
-3 funktioniert, wird 1 angezeigt.
0 tatschlich nich aber jetzt gehts. :D
Jetz müsste es ausgereift sein.

Code: Alles auswählen

;(c) Tommy
Procedure isNumeric(String.s)
String = ReplaceString(String, ",", ".")
ProcedureReturn Bool(Abs(ValF(String)) > 0 Or Abs(Val(String)) > 0 Or String = "0")
EndProcedure
Debug isNumeric("A123")
Debug isNumeric("123")
Debug isNumeric("123.456")
Debug isNumeric("123,456")
Debug isNumeric("$FF")
Debug isNumeric("-123")
Debug isNumeric("1.7e-6")
Debug isNumeric("%101")
Debug isNumeric("")
Debug isNumeric("0")
Zuletzt geändert von Tommy am 26.01.2015 14:53, insgesamt 1-mal geändert.
PB 5.41 x64
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: isNumeric

Beitrag von NicTheQuick »

Das Problem ist, dass du den Trick von Nino mit dem + "1" wieder raus genommen hast.
Der hatte nämlich verhindert, dass das hier funktioniert:

Code: Alles auswählen

Debug isNumeric("3a") ;ergibt 1
Ich würde eine isNumeric-Funktion lieber komplett neu schreiben anstatt so herum zu tricksen. Dann bleibt sie schnell und man kann ohne viele Probleme alle Möglichkeiten abdecken.
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: isNumeric

Beitrag von Nino »

Tommy hat geschrieben:5,5 is aber in der Mathematik trotzdem eine gültige Zahl.
Es geht hier aber nicht um reine Mathematik.
In der Mathematik ist z.B. auch i eine gültige Zahl. Wird das von Deinem Code richtig erkannt?
Tommy hat geschrieben:-3 funktioniert, wird 1 angezeigt.
Stimmt, ich hatte das Abs() übersehen.
Antworten