Ich habe hier ein spezielles Zahlenformat worauf ich gerne meine Strings überprüfen möchte. Die Umsetzung ist kein Problem, allerdings bin ich am überlegen wie ich das performant gestalten kann...
Erst mal zum Problem. Es geht darum eine einfache Zeichenkette auf ein spezielles Format zu untersuchen. Dabei müssen folgende Regeln beachtet werden:
- Ein String muss mit einem "-" oder einer Zahl von 0 bis 9 beginnen - Leerstrings sind unzulässig
- Beginnt der String mit einem "-" Zeichen muss eine Ziffer von 0 bis 9 als nächstes Zeichen folgen
- Beginnt der String mit der Ziffer "0" darf lediglich nur noch ein Dezimalpunkt folgen
- Beginnt der String mit einer Ziffer von 1 bis 9 dürfen weitere Ziffern sowie ein Dezimalpunkt folgen
- Nach dem Dezimalpunkt muss eine weitere Ziffer von 0 bis 9 folgen
- Ein kleines "e" oder großes "E" für die Exponentenschreibweise darf nur einmalig nach einer Ziffer von 0 bis 9 erfolgen
- Nach einem "e" oder "E" darf ein "+" oder "-" folgen - Danach mindestens eine Ziffer von 0 bis 9. (Ansonsten beliebig viele Ziffern hier nach)
Einige Beispiele:
1
2.3
-0
-0.12e-1
22.123912e+3
0e12
Hat hier jemand eine Idee wie man das gescheit umsetzen kann? Momentan gehe ich den String Zeichen für Zeichen durch und prüfe ihn auf die Regeln. Sollte was nicht passen gebe ich "False" zurück - Ansonsten "True". Allerdings bin ich unsicher ob das die beste Möglichkeit ist.
Zudem hoffe ich auch dass ich alle Regeln korrekt genannt habe. xD
Mein bisheriger Lösungsvorschlag:
[autoit]Func _IsNumber($sParam)
Local $aParam = StringToASCIIArray($sParam)
Local $iCase
For $i = 0 To UBound($aParam) -1
Switch $iCase
Case 0 ; Minus-Zeichen?
If $aParam[$i] <> AscW("-") Then $i -= 1
If $i = UBound($aParam) -1 Then Return False
$iCase = 1
Case 1 ; 1 bis 9 oder 0?
If $aParam[$i] >= AscW("1") And $aParam[$i] <= AscW("9") Then
$iCase = 2
ElseIf $aParam[$i] == AscW("0") Then
$iCase = 3
Else
Return False
EndIf
Case 2 ; Ziffer?
If $aParam[$i] < AscW("0") And $aParam[$i] > AscW("9") Then
$i -= 1
$iCase = 3
EndIf
Case 3 ; Punkt-Zeichen oder Potenz?
If $aParam[$i] = AscW(".") Then
$iCase = 4
If $i = UBound($aParam) -1 Then Return False
ElseIf $aParam[$i] = AscW("e") Or $aParam[$i] = AscW("E") Then
$iCase = 5
If $i = UBound($aParam) -1 Then Return False
Else
Return False
EndIf
Case 4 ; Ziffer oder Potenz?
If $aParam[$i] < AscW("0") And $aParam[$i] > AscW("9") Then
If $aParam[$i] <> AscW("e") Or $aParam <> AscW("E") Then Return False
If $i = UBound($aParam) -1 Then Return False
$iCase = 5
EndIf
Case 5 ; Plus oder Minus?
If $aParam[$i] <> AscW("+") Or $aParam[$i] <> AscW("-") Then $i -= 1
$iCase = 6
Case 6 ; Ziffer?
If $aParam[$i] < AscW("0") And $aParam[$i] > AscW("9") Then Return False
EndSwitch
Next
Return True
EndFunc