Code archives/Algorithms/A flexable VAL() Function
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
As with the previous submission, but corrected an oversight where I started to rename the negative flag to sign, and got interrupted before carrying through. | |||||
AppTitle "Emulating a VA() Function ; by Donald R. Darden, 2001 ; The main program generates sample strings of ; digits and shows what happens when you convert ; these values to a float value. While Not KeyHit(1) sample$="" For a=1 To 5 sample$=sample$+Chr$(Rand(48,57)) Next If Rnd(0,1) And Len(sample)>3 Then sample$=Left$(sample$,Len(sample$)-2)+"."+Right$(sample$,2) EndIf Print Chr$(34)+sample$+Chr$(34)+" = "+val#(sample$) WaitKey Wend End Function val#(sstring$) Local temp#=0 Local decimal=0 Local sign=1 Local a Local b Local c Local base=10 a=Instr(sstring$,"-",1) If a Then negative=-1 b=Instr(sstring$,"&",a+1) If b Then Select Mid$(sstring$,a+1,1) Case "B", "b" base=2 a=b+1 Case "O", "o" base=8 a=b+1 Case "H", "h" base=16 a=b+1 Default base=10 End Select End If decimal=0 For b=a+1 To Len(sstring$) c=Asc(Mid(sstring$,b,1)) Select c Case 44 ;"," Goto skip Case 45 ;"-" sign=-sign Case 46 ;"." decimal=1 Case 48,49,50,51,52,53,54,55,56,57 ;"0" To "9" temp#=temp*base+c-48 If decimal Then decimal=decimal*base Case 65,66,67,68,69,60 ;"A" to "F" If base=16 Then temp#=temp#*base+c-55 If decimal Then decimal=decimal*base Else Goto fini EndIf Case 97,98,99,100,101,102 ;"a" to "f" If base=16 Then temp#=temp#*base+c-87 If decimal Then decimal=decimal*base Else Goto fini EndIf Default Goto fini End Select .skip Next .fini If decimal Then temp#=temp#/decimal Return temp#*sign End Function |
Comments
None.
Code Archives Forum