Seite 1 von 3

isNumeric (alle OS, Anfänger-Tip)

Verfasst: 24.01.2015 14:07
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")

Re: isNumeric

Verfasst: 24.01.2015 17:54
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)

Re: isNumeric

Verfasst: 24.01.2015 18:01
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.

Re: isNumeric

Verfasst: 24.01.2015 18:20
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("")

Re: isNumeric

Verfasst: 24.01.2015 18:28
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

Re: isNumeric

Verfasst: 24.01.2015 18:42
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.

Re: isNumeric

Verfasst: 24.01.2015 18:45
von NicTheQuick
Aber jetzt kommt er nicht mehr mit 0 zurecht. ;)

Code: Alles auswählen

Debug isNumeric("0")

Re: isNumeric

Verfasst: 24.01.2015 18:54
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")

Re: isNumeric

Verfasst: 24.01.2015 19:11
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.

Re: isNumeric

Verfasst: 24.01.2015 19:16
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.