IsNumeric

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.
TKRoth
Beiträge: 32
Registriert: 24.02.2012 15:34
Wohnort: Hamburg
Kontaktdaten:

IsNumeric

Beitrag 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")
Computer werden benötigt um Probleme zu lösen die man ohne Computer nicht hätte.
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag von CodeCommander »

~ DELETE ~
Zuletzt geändert von CodeCommander am 18.01.2015 14:47, insgesamt 1-mal geändert.
~ DELETE ~
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: IsNumeric

Beitrag 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")
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
TKRoth
Beiträge: 32
Registriert: 24.02.2012 15:34
Wohnort: Hamburg
Kontaktdaten:

Re: IsNumeric

Beitrag 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.
Computer werden benötigt um Probleme zu lösen die man ohne Computer nicht hätte.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: IsNumeric

Beitrag 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. :)
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten