New IsNumeric

Share your advanced PureBasic knowledge/code with the community.
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

New IsNumeric

Post by mk-soft »

Even though there are some examples, I have rewritten them

Update v1.02.2
- Allow characters after number (like PB)
- Allow spaces before number (like PB)
- Rules tightened (Stricter like PB)

Code: Select all

;-TOP by mk-soft, v1.02.2, 12.11.2022

Enumeration 1
  #IsInteger
  #IsFloat
EndEnumeration

Procedure IsNumeric(Value.s)
  Protected r1, *value.character, signed, num, float, exponent, exponent2
  
  *value = @Value
  If *value
    Repeat
      If *value\c = '+' Or *value\c = '-'
        If signed
          num = #False
          Break
        EndIf
        signed = #True
      ElseIf *value\c >= '0' And *value\c <= '9'
        num = #True
        Break
      ElseIf *value\c <> ' '
        Break
      EndIf
      *value + SizeOf(character)
    ForEver
    If num
      Repeat
        *value + SizeOf(character)
        If *value\c = 0
          Break
        EndIf
        If *value\c = '.'
          float = 1
          Break
        ElseIf *value\c = 'e' Or *value\c = 'E'
          exponent = 1
          Break
        ElseIf *value\c < '0' Or *value\c > '9'
          Break
        EndIf
      ForEver
      
      If float
        Repeat
          *value + SizeOf(character)
          If *value\c >= '0' And *value\c <= '9'
            float + 1
          ElseIf *value\c = 'e' Or *value\c = 'E'
            exponent = 1
            Break
          Else
            Break
          EndIf
        ForEver
      EndIf
      If exponent
        Repeat
          *value + SizeOf(character)
          If *value\c >= '0' And *value\c <= '9'
            exponent + 1
          ElseIf *value\c = '+' Or *value\c = '-'
            If exponent >= 2
              Break
            ElseIf exponent2
              num = #False
              Break
            EndIf
            exponent2 = #True
          Else
            Break
          EndIf
        ForEver
      EndIf
      If num
        If float And float < 2
          r1 = 0
        ElseIf exponent And exponent < 2
          r1 = 0
        Else
          If float
            r1 = #IsFloat
          Else 
            r1 = #IsInteger
          EndIf
        EndIf  
      EndIf
    EndIf
  EndIf
  ProcedureReturn r1
EndProcedure

; ****

CompilerIf #PB_Compiler_IsMainFile
  
  Define t1.s
  
  Debug "Numbers"
  
  t1 = " 50"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "1000"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + Val(t1)
  
  t1 = "+1000 Meters"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + Val(t1)
  
  t1 = "-1000"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + Val(t1)
  
  t1 = "1.1"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "+100.0%"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "-100.0%"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "1E3"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "1.0e3+2"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "-0.1E+5+"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "-1.0e-3"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  
  Debug "Invalid Numbers"
  t1 = ".100"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  t1 = "100."
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "++100"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "--100"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "100..0"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "s100.0"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "2E"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = "1.0ee-3"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  t1 = "1.0e+-3"
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
  t1 = ""
  Debug t1 + " = Type " + IsNumeric(t1) + " Value = " + ValF(t1)
  
CompilerEndIf

My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive