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.
NicTheQuick hat geschrieben: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:
@NicTheQuick:
Vielen Dank, dass Du diesen Bug gefunden hast.
Ich habe jetzt ein ValD() durch ValF() ersetzt, und das andere ValD() stehen gelassen.
Nun funktioniert auch Dein Beispiel.
Aber evtl. wird sich wieder ein anderes Beispiel finden lassen, wo's nicht funktioniert.
Procedure.i isNumeric(value.s)
Protected *c.Character = @value
;Skip whitespaces
While *c\c = ' ' Or *c\c = 9
*c + SizeOf(Character)
Wend
;Skip Minus and Plus signs
Protected i.i = 0
While *c\c = '-' Or *c\c = '+'
*c + SizeOf(Character)
i + 1
Wend
If (i > 1) ; Error if more than one sign
ProcedureReturn #False
EndIf
i = 0
Select *c\c
Case '$' ; Hex
Repeat
i + 1
*c + SizeOf(Character)
Until Not ((*c\c >= '0' And *c\c <= '9') Or (*c\c >= 'a' And *c\c <= 'f') Or (*c\c >= 'A' And *c\c <= 'F'))
i - 1
Case '%' ; Binary
Repeat
i + 1
*c + SizeOf(Character)
Until *c\c <> '0' And *c\c <> '1'
i - 1
Case '0' To '9' ; Decimal
Protected j = 0
Repeat
i + 1
If (*c\c = '.')
If (j = 1) ;Too many commas
ProcedureReturn #False
EndIf
j + 1
EndIf
*c + SizeOf(Character)
Until (*c\c < '0' Or *c\c > '9') And *c\c <> '.'
If (i - j = 0) ; No digits
ProcedureReturn #False
EndIf
If (*c\c = 'e' Or *c\c = 'E') ;Exponent
*c + SizeOf(Character)
;Skip Minus and Plus signs
i = 0
While *c\c = '-' Or *c\c = '+'
*c + SizeOf(Character)
i + 1
Wend
If (i > 1) ; Error if more than one sign
ProcedureReturn #False
EndIf
While (*c\c >= '0' And *c\c <= '9')
*c + SizeOf(Character)
i + 1
Wend
EndIf
Default
ProcedureReturn #False
EndSelect
While *c\c = ' ' Or *c\c = 9
*c + SizeOf(Character)
Wend
ProcedureReturn Bool(i And *c\c = 0)
EndProcedure
; === Test ===
Debug "=== Numeric ==="
Debug IsNumeric("123")
Debug IsNumeric("1.23")
Debug IsNumeric("-1.234567890123456")
Debug IsNumeric("$FF")
Debug IsNumeric("-%101 ")
Debug IsNumeric("+1.7e-6")
Debug IsNumeric("0")
Debug IsNumeric(" -0.0")
Debug "=== Not Numeric ==="
Debug isNumeric("--12")
Debug isNumeric("12.45.6")
Debug isNumeric("%")
Debug isNumeric("$g")
Debug IsNumeric("12c")
Debug IsNumeric("12c")
Debug IsNumeric("abc")
Debug IsNumeric("")
'ValD()' akzeptiert übrigens auch Dezimalzahlen ohne Ziffern vor dem Komma. Falls das auch hier gewünscht ist, muss man lediglich aus
Vera hat geschrieben:Frage: Wo findet man, welche Anteile der Rex-Ex-Ausdrücke PB-Syntax sind?
Was meinst du damit? RegEx ist RegEx. Das hat nichts mit PB zu tun. Außer, dass man da RegEx eben nutzen kann. Alles weitere findest du bei Wiki - Regulärer Ausdruck.