Seite 1 von 1

IsValidNumericalFormat()

Verfasst: 26.07.2011 18:04
von cxAlex
Kleine Procedure die Überprüft ob ein String ein gültiges Zahlenformat enthält das die PB - Val/ValF/ValD... Funktionen übersetzen können. Die Procedure erkennt Hex & Binärformat, natürlich auch negativ, erkennt Float - Zahlen und auch die Exponential-Schreibweise (so perverse Sachen wie -45.6e-5) korrekt.

Wers braucht:

Code: Alles auswählen

; Gültiges Zahlenformat: 
Procedure IsValidNumericalFormat(Var$)
  Protected *Var.Character, *VarLF.Character
  Protected FPE, FPP, ValType = #PB_Long
  
  If Not Var$
    ProcedureReturn #False
  EndIf
  
  *Var = @Var$
  
  ; Negative Zahlen erlaubt
  If *Var\c = '-'
    *Var + SizeOf(Character) 
  EndIf
  
  Select *Var\c
    Case '%' ; Binärzahl
      *Var + SizeOf(Character)
      While *Var\c
        Select *Var\c  
          Case '0','1'
          Default : ProcedureReturn #False
        EndSelect
        *Var + SizeOf(Character)
      Wend
      ProcedureReturn #True
      
    Case '$' ; Hex-Zahl
      *Var + SizeOf(Character)
      While *Var\c
        Select *Var\c  
          Case '0' To '9', 'a' To 'f', 'A' To 'F'
          Default : ProcedureReturn #False
        EndSelect
        *Var + SizeOf(Character)
      Wend
      ProcedureReturn #True
      
    Default ; Normale und Float - Zahlen:
      While *Var\c
        Select *Var\c  
          Case '0' To '9'
          Case 'e' ; Floating-Point Exponent
            If FPE
              ProcedureReturn #False
            Else
              FPE = #True
              ValType = #PB_Float
              *VarLF = *Var + SizeOf(Character)
              If *VarLF\c = '-'
                *Var + SizeOf(Character)
                *VarLF = *Var + SizeOf(Character)
              EndIf
              If Not *VarLF\c
                ProcedureReturn #False
              EndIf
            EndIf
          Case '.' ; Floating-Point Punkt
            If FPP Or FPE
              ProcedureReturn #False
            Else
              FPP = #True
              ValType = #PB_Float
            EndIf
          Default : ProcedureReturn #False
        EndSelect
        *Var + SizeOf(Character)
      Wend
      
      ProcedureReturn ValType
  EndSelect
EndProcedure

Debug "Gültig: "
Debug IsValidNumericalFormat("$FF")
Debug IsValidNumericalFormat("-%101011")
Debug IsValidNumericalFormat("123")
Debug IsValidNumericalFormat("-123")
Debug IsValidNumericalFormat("-123.")
Debug IsValidNumericalFormat("-123.45")
Debug IsValidNumericalFormat("123.45")
Debug IsValidNumericalFormat("-123.45e2")
Debug IsValidNumericalFormat("-123.45e-3")
Debug IsValidNumericalFormat("-123.e-3")

Debug "Ungültig: "
Debug IsValidNumericalFormat("$FX")
Debug IsValidNumericalFormat("%102011")
Debug IsValidNumericalFormat("123C")
Debug IsValidNumericalFormat("123..")
Debug IsValidNumericalFormat("-123.45eF")
Debug IsValidNumericalFormat("-123.45e-3.5")
Debug IsValidNumericalFormat("-123.e-.3")
Debug IsValidNumericalFormat("-$FF.")
Gruß, Alex