Seite 1 von 1

IsNumeric

Verfasst: 15.11.2014 09:30
von TKRoth
Mit dieser Routinen lassen sich Zahlen prüfen, welche als String übergeben werden:

Code: Alles auswählen

EnableExplicit

Structure CharacterArray
  StructureUnion
    c.a[0]
  EndStructureUnion
EndStructure

Procedure.w IsNumeric(St.s)
  Protected *String.CharacterArray=@St
  Protected Cnt.l,Length.l=MemoryStringLength(*String,#PB_Ascii)
  Protected Pt.w,e.w
  Select *String\c[0]
    Case Asc("+"),Asc("-") :Cnt=1:
    Case Asc(".")          :Cnt=1:Pt=#True
  EndSelect:If Length=Cnt:ProcedureReturn #False:EndIf
  Repeat
    Select *String\c[Cnt]
      Case Asc("0") To Asc("9") :Cnt+1:Continue
      Case Asc(".")             :If Pt:ProcedureReturn #False:Else:Pt=#True:Cnt+1:Continue:EndIf
      Case Asc("e"),Asc("E")    
        If e
          ProcedureReturn #False
        Else
          Cnt+1:Select *String\c[Cnt]
            Case Asc("+"),Asc("-"),Asc("0") To Asc("9"):e=#True:Cnt+1
            Default:ProcedureReturn #False
          EndSelect
        EndIf
      Default:ProcedureReturn #False
    EndSelect
  Until Length=Cnt:ProcedureReturn #True
EndProcedure

Debug "Zahlen"
Debug IsNumeric("123")
Debug IsNumeric("17.3")
Debug IsNumeric("-14.8")
Debug IsNumeric(".67")
Debug IsNumeric("45e11")
Debug IsNumeric("1.7e-6")
Debug IsNumeric("-65e-4")
Debug ""
Debug "Keine Zahlen"
Debug IsNumeric("45Alpha")
Debug IsNumeric("1...2...3...Meins")
Debug IsNumeric("PureBasic")

Verfasst: 15.11.2014 11:54
von CodeCommander
~ DELETE ~

Re: IsNumeric

Verfasst: 15.11.2014 11:57
von STARGÅTE
Es sind halt wieder ein paar Monate um, seit dem letzten IsNumeric ^^

Ein paar Hinweise:
  • Du kannst deine Asc("+") usw. durch '+' ersetzen, das ist in PB nämlich das äquivalent dazu.
  • Hat es ein Grund warum deine Prozedur eine Word zurück gibt?
  • Dein Code funktioniert nicht unter Unicode!
    Zahlen
    1
    1
    0
    0
    1
    1
    0

    Keine Zahlen
    1
    1
    0
    Liegt vermutlich daran, dass deine Characters in wirklichkeit mit .a definiert sind.
    Bitte zu .c korrigieren und dass du MemoryStringLength(*String,#PB_Ascii) benutzt.
    Die länge deines Strings (in Zeichen) bekommst du mit Len(St.s)
Geänderte Version:

Code: Alles auswählen


EnableExplicit

Structure CharacterArray
  StructureUnion
    c.c[0]
  EndStructureUnion
EndStructure

Procedure.i IsNumeric(St.s)
  Protected *String.CharacterArray=@St
  Protected Cnt.i,Length.i=Len(St.s)
  Protected Pt.i,e.i
  Select *String\c[0]
    Case '+', '-' :Cnt=1:
    Case '.'          :Cnt=1:Pt=#True
  EndSelect:If Length=Cnt:ProcedureReturn #False:EndIf
  Repeat
    Select *String\c[Cnt]
      Case '0' To '9' :Cnt+1:Continue
      Case '.'             :If Pt:ProcedureReturn #False:Else:Pt=#True:Cnt+1:Continue:EndIf
      Case 'e','E'    
        If e
          ProcedureReturn #False
        Else
          Cnt+1:Select *String\c[Cnt]
            Case '+','-','0' To '9':e=#True:Cnt+1
            Default:ProcedureReturn #False
          EndSelect
        EndIf
      Default:ProcedureReturn #False
    EndSelect
  Until Length=Cnt:ProcedureReturn #True
EndProcedure

Debug "Zahlen"
Debug IsNumeric("123")
Debug IsNumeric("17.3")
Debug IsNumeric("-14.8")
Debug IsNumeric(".67")
Debug IsNumeric("45e11")
Debug IsNumeric("1.7e-6")
Debug IsNumeric("1.1")
Debug ""
Debug "Keine Zahlen"
Debug IsNumeric("45Alpha")
Debug IsNumeric("1...2...3...Meins")
Debug IsNumeric("PureBasic")

Re: IsNumeric

Verfasst: 15.11.2014 12:54
von TKRoth
@CodeCommander: Aber keine beherrschte die wissenschaftliche Darstellung.

@Stargate: Danke für die Änderung. Unter Unicode habe ich es noch nicht getestet, da ich das eigentlich nicht verwende.

Re: IsNumeric

Verfasst: 15.11.2014 15:47
von PMV
TKRoth hat geschrieben:@CodeCommander: Aber keine beherrschte die wissenschaftliche Darstellung.

@Stargate: Danke für die Änderung. Unter Unicode habe ich es noch nicht getestet, da ich das eigentlich nicht verwende.
Tipp: In absehbarer Zeit wird nur noch Unicode unterstützt. Also besser direkt damit Programmieren. :)