Sorry to re-open a two years old topic but I have little bit modified the Micheal Vogel original code so I return it back to community.
By the way, apparently the conversion from string to VogelNumberFormat work only if the program is compiled in Ascii mode. I get strange result with Unicode program.
Edit #1 : PeekS() replaced by equivalent Mid() inside String_To_VogelsNumberFormat(), now the command the command work well whatever if the program is Ascii or Unicode
Edit #2 : Read/WritePreference command added + Random modification for stripping leading 0 manually
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code generated by : Dev-Type V4.0.0
; Project name : Vogels Number Format
; File name : Vogels Number Format.pb
; File Version : 1.0.2
; Programmation : OK
; Programmed by : Guimauve
; Creation Date : 06-07-2012
; Last update : 01-11-2012
; Coded for : PureBasic 5.00 Beta 8
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Programming notes
;
; This code is a re-work of Vogels Number Format orginally
; created by Michel Vogel (PureBasic English Forum).
;
; List of changes :
;
; - VNF structure name : Renamed to "VogelsNumberFormat"
; - Number() ---> Removed : Use VogelsNumberFormat_To_String() instead
; - GetNumber() ---> Removed : Use VogelsNumberFormat_To_String() instead
; - PutNumber() ---> Removed : Use String_To_VogelsNumberFormat() instead
;
; Commands added :
;
; - VogelsNumberFormat_To_String()
; - String_To_VogelsNumberFormat()
; - ReadVogelsNumberFormat()
; - WriteVogelsNumberFormat()
; - VogelsNumberFormat_Factorial() --> Work upto 999!
; - VogelsNumberFormat_Random()
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Size Array Constants <<<<<
#VOGELS_NUMBER_FORMAT_NUM_MAX = 100000
#VOGELS_NUMBER_FORMAT_NEGATIVE = 1
#VOGELS_NUMBER_FORMAT_POSITIVE = 0
#VOGELS_NUMBER_FORMAT_UNDEFINED = -1
#VOGELS_NUMBER_FORMAT_INFINITIVE = -2
#VOGELS_NUMBER_FORMAT_OVERFLOW = -3
#VOGELS_NUMBER_FORMAT_NOT_IMPLEMENTED = -4
#VOGELS_NUMBER_FORMAT_LEN = 9
#VOGELS_NUMBER_FORMAT_MOD = 1000000000
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure declaration <<<<<
Structure VogelsNumberFormat
Len.w
Sign.w
Num.l[#VOGELS_NUMBER_FORMAT_NUM_MAX]
EndStructure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The observators <<<<<
Macro GetVogelsNumberFormatLen(VogelsNumberFormatA)
VogelsNumberFormatA\Len
EndMacro
Macro GetVogelsNumberFormatSign(VogelsNumberFormatA)
VogelsNumberFormatA\Sign
EndMacro
Macro GetVogelsNumberFormatNum(VogelsNumberFormatA, NumID)
VogelsNumberFormatA\Num[NumID]
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The mutators <<<<<
Macro SetVogelsNumberFormatLen(VogelsNumberFormatA, P_Len)
GetVogelsNumberFormatLen(VogelsNumberFormatA) = P_Len
EndMacro
Macro SetVogelsNumberFormatSign(VogelsNumberFormatA, P_Sign)
GetVogelsNumberFormatSign(VogelsNumberFormatA) = P_Sign
EndMacro
Macro SetVogelsNumberFormatNum(VogelsNumberFormatA, NumID, P_Num)
GetVogelsNumberFormatNum(VogelsNumberFormatA, NumID) = P_Num
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Reset operator <<<<<
Macro ResetVogelsNumberFormat(VogelsNumberFormatA)
ClearStructure(VogelsNumberFormatA, VogelsNumberFormat)
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Read in Binary file <<<<<
Procedure ReadVogelsNumberFormat(FileID.l, *VogelsNumberFormatA.VogelsNumberFormat)
SetVogelsNumberFormatLen(*VogelsNumberFormatA, ReadWord(FileID))
SetVogelsNumberFormatSign(*VogelsNumberFormatA, ReadWord(FileID))
For NumID = 0 To GetVogelsNumberFormatLen(*VogelsNumberFormatA)
SetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID, ReadLong(FileID))
Next
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Write in Binary file <<<<<
Procedure WriteVogelsNumberFormat(FileID.l, *VogelsNumberFormatA.VogelsNumberFormat)
WriteWord(FileID, GetVogelsNumberFormatLen(*VogelsNumberFormatA))
WriteWord(FileID, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
For NumID = 0 To GetVogelsNumberFormatLen(*VogelsNumberFormatA)
WriteLong(FileID, GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID))
Next
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 00.005 seconds (25600.00 lines/second) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Declare VogelsNumberFormat_Add(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
Declare VogelsNumberFormat_Sub(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
Procedure.s VogelsNumberFormat_To_String(*VogelsNumberFormatA.VogelsNumberFormat)
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) < 0
Select GetVogelsNumberFormatLen(*VogelsNumberFormatA)
Case #VOGELS_NUMBER_FORMAT_UNDEFINED
VFN_2_String.s = "Undefined"
Case #VOGELS_NUMBER_FORMAT_INFINITIVE
VFN_2_String = "Infinitive"
If GetVogelsNumberFormatSign(*VogelsNumberFormatA)
VFN_2_String = "Minus " + VFN_2_String
EndIf
Case #VOGELS_NUMBER_FORMAT_OVERFLOW
VFN_2_String = "Overflow"
Case #VOGELS_NUMBER_FORMAT_NOT_IMPLEMENTED
VFN_2_String = "Not Implemented"
EndSelect
Else
If GetVogelsNumberFormatSign(*VogelsNumberFormatA)
VFN_2_String = "-"
EndIf
NumID = GetVogelsNumberFormatLen(*VogelsNumberFormatA)
VFN_2_String + Str(GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID))
While NumID > 0
NumID - 1
VFN_2_String + RSet(Str(GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID)), #VOGELS_NUMBER_FORMAT_LEN, "0")
Wend
EndIf
ProcedureReturn VFN_2_String
EndProcedure
Procedure String_To_VogelsNumberFormat(*VogelsNumberFormatA.VogelsNumberFormat, String.s)
SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_POSITIVE)
NumID = Len(String) - #VOGELS_NUMBER_FORMAT_LEN
While NumID > 0
SetVogelsNumberFormatNum(*VogelsNumberFormatA, p, Val(Mid(String, NumID+1, #VOGELS_NUMBER_FORMAT_LEN)))
p + 1
NumID - #VOGELS_NUMBER_FORMAT_LEN
Wend
NumID = Val(Mid(String, 1, 9 + NumID))
If NumID < 0
SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_NEGATIVE)
NumID = -NumID
EndIf
SetVogelsNumberFormatNum(*VogelsNumberFormatA, p, NumID)
SetVogelsNumberFormatLen(*VogelsNumberFormatA, p)
EndProcedure
Procedure VogelsNumberFormat_Normalize(*VogelsNumberFormatA.VogelsNumberFormat)
; Strap leading zeros (000.000.000)
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) >= 0
While (GetVogelsNumberFormatLen(*VogelsNumberFormatA) >= 0) And (GetVogelsNumberFormatNum(*VogelsNumberFormatA, GetVogelsNumberFormatLen(*VogelsNumberFormatA)) = 0)
SetVogelsNumberFormatLen(*VogelsNumberFormatA, GetVogelsNumberFormatLen(*VogelsNumberFormatA) - 1)
Wend
; Value equal Zero? Positiv sign
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) < 0
SetVogelsNumberFormatLen(*VogelsNumberFormatA, 0)
SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_POSITIVE)
EndIf
EndIf
EndProcedure
Procedure VogelsNumberFormat_Error(type, stype, *VogelsNumberFormatA.VogelsNumberFormat)
If type >= 0
type = stype
EndIf
SetVogelsNumberFormatLen(*VogelsNumberFormatA, type)
Debug "ERROR " + Str(type)
ProcedureReturn Type
EndProcedure
Procedure VogelsNumberFormat_Copy(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat)
SetVogelsNumberFormatLen(*VogelsNumberFormatB, GetVogelsNumberFormatLen(*VogelsNumberFormatA))
SetVogelsNumberFormatSign(*VogelsNumberFormatB, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
For NumID = GetVogelsNumberFormatLen(*VogelsNumberFormatA) To 0 Step -1
SetVogelsNumberFormatNum(*VogelsNumberFormatB, NumID, GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID))
Next
EndProcedure
Procedure VogelsNumberFormat_Zero(*VogelsNumberFormatA.VogelsNumberFormat)
SetVogelsNumberFormatLen(*VogelsNumberFormatA, 0)
SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_POSITIVE)
For NumID = 0 To #VOGELS_NUMBER_FORMAT_NUM_MAX - 1
SetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID, 0)
Next
EndProcedure
Procedure VogelsNumberFormat_Abs(*VogelsNumberFormatA.VogelsNumberFormat)
SetVogelsNumberFormatSign(*VogelsNumberFormatA, #VOGELS_NUMBER_FORMAT_POSITIVE)
EndProcedure
Procedure VogelsNumberFormat_Equal(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, Abs = 0)
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) <> GetVogelsNumberFormatLen(*VogelsNumberFormatB)
ProcedureReturn #False
ElseIf (Abs = 0) And (GetVogelsNumberFormatSign(*VogelsNumberFormatA) <> GetVogelsNumberFormatSign(*VogelsNumberFormatB))
ProcedureReturn #False
Else
For NumID = GetVogelsNumberFormatLen(*VogelsNumberFormatA) To 0 Step -1
If GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID) <> GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID)
ProcedureReturn #False
EndIf
Next
ProcedureReturn #True
EndIf
EndProcedure
Procedure VogelsNumberFormat_GreaterThan(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, Abs = 0)
If Abs = 0
If GetVogelsNumberFormatSign(*VogelsNumberFormatA) <> GetVogelsNumberFormatSign(*VogelsNumberFormatB)
If GetVogelsNumberFormatSign(*VogelsNumberFormatA) = #VOGELS_NUMBER_FORMAT_POSITIVE
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndIf
Else
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) > GetVogelsNumberFormatLen(*VogelsNumberFormatB)
ProcedureReturn #True
ElseIf GetVogelsNumberFormatLen(*VogelsNumberFormatA) < GetVogelsNumberFormatLen(*VogelsNumberFormatB)
ProcedureReturn #False
Else
For NumID = GetVogelsNumberFormatLen(*VogelsNumberFormatA) To 0 Step -1
d = GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID) - GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID)
If d > 0
ProcedureReturn #True
ElseIf d < 0
ProcedureReturn #False
EndIf
Next
ProcedureReturn #False; a=b
EndIf
EndIf
EndProcedure
Procedure VogelsNumberFormat_Positive(*VogelsNumberFormatA.VogelsNumberFormat)
If GetVogelsNumberFormatSign(*VogelsNumberFormatA) = #VOGELS_NUMBER_FORMAT_POSITIVE
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure VogelsNumberFormat_Mul(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
Protected la, lb
Protected s.q, z.q
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) < 0 Or GetVogelsNumberFormatLen(*VogelsNumberFormatB) < 0
Error = VogelsNumberFormat_Error(GetVogelsNumberFormatLen(*VogelsNumberFormatA), GetVogelsNumberFormatLen(*VogelsNumberFormatB), *VogelsNumberFormatC)
Else
SetVogelsNumberFormatSign(*VogelsNumberFormatC, (GetVogelsNumberFormatSign(*VogelsNumberFormatA) + GetVogelsNumberFormatSign(*VogelsNumberFormatB)) & 1)
SetVogelsNumberFormatLen(*VogelsNumberFormatC, GetVogelsNumberFormatLen(*VogelsNumberFormatA) + GetVogelsNumberFormatLen(*VogelsNumberFormatB) + 1)
For NumID = 0 To GetVogelsNumberFormatLen(*VogelsNumberFormatC)
SetVogelsNumberFormatNum(*VogelsNumberFormatC, NumID, 0)
Next
la = 0
Repeat
lb = 0
Repeat
s.q = GetVogelsNumberFormatNum(*VogelsNumberFormatA, la) * GetVogelsNumberFormatNum(*VogelsNumberFormatB, lb) + GetVogelsNumberFormatNum(*VogelsNumberFormatC, la+lb)
SetVogelsNumberFormatNum(*VogelsNumberFormatC, la + lb, s % #VOGELS_NUMBER_FORMAT_MOD)
SetVogelsNumberFormatNum(*VogelsNumberFormatC, la + lb + 1, GetVogelsNumberFormatNum(*VogelsNumberFormatC, la + lb + 1) + s / #VOGELS_NUMBER_FORMAT_MOD)
lb + 1
Until lb > GetVogelsNumberFormatLen(*VogelsNumberFormatB)
la + 1
Until la > GetVogelsNumberFormatLen(*VogelsNumberFormatA)
VogelsNumberFormat_Normalize(*VogelsNumberFormatC)
EndIf
ProcedureReturn Error
EndProcedure
Procedure Private_VogelsNumberFormat_MuW(*VogelsNumberFormatA.VogelsNumberFormat, b.l, *VogelsNumberFormatC.VogelsNumberFormat)
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) < 0
Error = VogelsNumberFormat_Error(GetVogelsNumberFormatLen(*VogelsNumberFormatA), 0, *VogelsNumberFormatC)
Else
If b = 0
VogelsNumberFormat_Zero(*VogelsNumberFormatC)
Else
If b < 0
b = -b
SetVogelsNumberFormatSign(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_NEGATIVE - GetVogelsNumberFormatSign(*VogelsNumberFormatA))
Else
SetVogelsNumberFormatSign(*VogelsNumberFormatC, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
EndIf
NumID = 0
For NumID = 0 To GetVogelsNumberFormatLen(*VogelsNumberFormatA)
m.q + GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID) * b
SetVogelsNumberFormatNum(*VogelsNumberFormatC, NumID, m % #VOGELS_NUMBER_FORMAT_MOD)
m / #VOGELS_NUMBER_FORMAT_MOD
Next
If m
SetVogelsNumberFormatNum(*VogelsNumberFormatC, NumID, m)
Else
NumID - 1
EndIf
SetVogelsNumberFormatLen(*VogelsNumberFormatC, NumID)
EndIf
EndIf
ProcedureReturn Error
EndProcedure
Procedure Private_VogelsNumberFormat_DiW(*VogelsNumberFormatA.VogelsNumberFormat, b.l, *VogelsNumberFormatC.VogelsNumberFormat)
Protected NumID
Protected d.q, q.q
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) < 0
Error = VogelsNumberFormat_Error(GetVogelsNumberFormatLen(*VogelsNumberFormatA), 0, *VogelsNumberFormatC)
Else
If b = 0
SetVogelsNumberFormatLen(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_UNDEFINED)
Else
If b < 0
b = -b
SetVogelsNumberFormatSign(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_NEGATIVE - GetVogelsNumberFormatSign(*VogelsNumberFormatA))
Else
SetVogelsNumberFormatSign(*VogelsNumberFormatC, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
EndIf
For NumID = GetVogelsNumberFormatLen(*VogelsNumberFormatA) To 0 Step -1
d = d * #VOGELS_NUMBER_FORMAT_MOD + GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID)
q = d / b
SetVogelsNumberFormatNum(*VogelsNumberFormatC, NumID, q)
d - q * b
Next
VogelsNumberFormat_Normalize(*VogelsNumberFormatC)
EndIf
EndIf
ProcedureReturn Error
EndProcedure
Procedure VogelsNumberFormat_Div(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) < 0 Or GetVogelsNumberFormatLen(*VogelsNumberFormatB) < 0
Error = VogelsNumberFormat_Error(GetVogelsNumberFormatLen(*VogelsNumberFormatA), GetVogelsNumberFormatLen(*VogelsNumberFormatB), *VogelsNumberFormatC)
Else
If GetVogelsNumberFormatLen(*VogelsNumberFormatB) = 0
If GetVogelsNumberFormatNum(*VogelsNumberFormatB, 0) = 0
SetVogelsNumberFormatLen(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_UNDEFINED)
Else
Private_VogelsNumberFormat_DiW(*VogelsNumberFormatA, GetVogelsNumberFormatNum(*VogelsNumberFormatB, 0), *VogelsNumberFormatC)
SetVogelsNumberFormatSign(*VogelsNumberFormatC, -(1 & (GetVogelsNumberFormatSign(*VogelsNumberFormatA) + GetVogelsNumberFormatSign(*VogelsNumberFormatB))))
EndIf
Else
If VogelsNumberFormat_GreaterThan(*VogelsNumberFormatB, *VogelsNumberFormatA, #True)
VogelsNumberFormat_Zero(*VogelsNumberFormatC)
Else
; Hmmm...
EndIf
EndIf
EndIf
ProcedureReturn Error
EndProcedure
Procedure VogelsNumberFormat_Add(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
Protected n
Protected s
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) < 0 Or GetVogelsNumberFormatLen(*VogelsNumberFormatB) < 0
Error = VogelsNumberFormat_Error(GetVogelsNumberFormatLen(*VogelsNumberFormatA), GetVogelsNumberFormatLen(*VogelsNumberFormatB), *VogelsNumberFormatC)
Else
If GetVogelsNumberFormatSign(*VogelsNumberFormatA) <> GetVogelsNumberFormatSign(*VogelsNumberFormatB)
SetVogelsNumberFormatSign(*VogelsNumberFormatB, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
VogelsNumberFormat_Sub(*VogelsNumberFormatA, *VogelsNumberFormatB, *VogelsNumberFormatC)
Else
SetVogelsNumberFormatSign(*VogelsNumberFormatC, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) < GetVogelsNumberFormatLen(*VogelsNumberFormatB)
Swap *VogelsNumberFormatA, *VogelsNumberFormatB
EndIf
For NumID = 0 To GetVogelsNumberFormatLen(*VogelsNumberFormatA)
s + GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID)
If NumID <= GetVogelsNumberFormatLen(*VogelsNumberFormatB)
s + GetVogelsNumberFormatNum(*VogelsNumberFormatB, NumID)
EndIf
SetVogelsNumberFormatNum(*VogelsNumberFormatC, NumID, s % #VOGELS_NUMBER_FORMAT_MOD)
s / #VOGELS_NUMBER_FORMAT_MOD
Next
NumID + 1
If s
SetVogelsNumberFormatNum(*VogelsNumberFormatC, NumID, s)
Else
NumID - 1
EndIf
SetVogelsNumberFormatLen(*VogelsNumberFormatC, NumID)
VogelsNumberFormat_Normalize(*VogelsNumberFormatC)
EndIf
EndIf
ProcedureReturn Error
EndProcedure
Procedure VogelsNumberFormat_Sub(*VogelsNumberFormatA.VogelsNumberFormat, *VogelsNumberFormatB.VogelsNumberFormat, *VogelsNumberFormatC.VogelsNumberFormat)
Protected n
Protected s
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) < 0 Or GetVogelsNumberFormatLen(*VogelsNumberFormatB) < 0
Error = VogelsNumberFormat_Error(GetVogelsNumberFormatLen(*VogelsNumberFormatA), GetVogelsNumberFormatLen(*VogelsNumberFormatB), *VogelsNumberFormatC)
Else
If GetVogelsNumberFormatSign(*VogelsNumberFormatA) <> GetVogelsNumberFormatSign(*VogelsNumberFormatB)
SetVogelsNumberFormatSign(*VogelsNumberFormatB, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
VogelsNumberFormat_Add(*VogelsNumberFormatA, *VogelsNumberFormatB, *VogelsNumberFormatC)
Else
If VogelsNumberFormat_GreaterThan(*VogelsNumberFormatA, *VogelsNumberFormatB, #True)
SetVogelsNumberFormatSign(*VogelsNumberFormatC, GetVogelsNumberFormatSign(*VogelsNumberFormatA))
Else
Swap *VogelsNumberFormatA, *VogelsNumberFormatB
SetVogelsNumberFormatSign(*VogelsNumberFormatC, #VOGELS_NUMBER_FORMAT_NEGATIVE - GetVogelsNumberFormatSign(*VogelsNumberFormatA))
EndIf
For NumID = 0 To GetVogelsNumberFormatLen(*VogelsNumberFormatA)
s + GetVogelsNumberFormatNum(*VogelsNumberFormatA, NumID)
If NumID <= GetVogelsNumberFormatLen(*VogelsNumberFormatB)
s - GetVogelsNumberFormatNum(*VogelsNumberFormatB, NumID)
EndIf
If s < 0
SetVogelsNumberFormatNum(*VogelsNumberFormatC, NumID, s + #VOGELS_NUMBER_FORMAT_MOD)
s = -1
Else
SetVogelsNumberFormatNum(*VogelsNumberFormatC, NumID, s)
s = 0
EndIf
Next
SetVogelsNumberFormatLen(*VogelsNumberFormatC, NumID)
VogelsNumberFormat_Normalize(*VogelsNumberFormatC)
EndIf
EndIf
ProcedureReturn Error
EndProcedure
Procedure VogelsNumberFormat_Square(*VogelsNumberFormatA.VogelsNumberFormat)
If GetVogelsNumberFormatLen(*VogelsNumberFormatA) >= 0
Error = VogelsNumberFormat_Mul(*VogelsNumberFormatA, *VogelsNumberFormatA, VNF_Cache_C.VogelsNumberFormat)
VogelsNumberFormat_Copy(VNF_Cache_C, *VogelsNumberFormatA)
ResetVogelsNumberFormat(VNF_Cache_C)
EndIf
ProcedureReturn Error
EndProcedure
Procedure VogelsNumberFormat_Pow(*VogelsNumberFormatA.VogelsNumberFormat, Exponent.l, *VogelsNumberFormatC.VogelsNumberFormat)
Protected z = 0, s, sign
If Exponent < 0
; a^b | b<0 not implemented for now...
VogelsNumberFormat_Error(#VOGELS_NUMBER_FORMAT_NOT_IMPLEMENTED, 0, *VogelsNumberFormatC)
ElseIf GetVogelsNumberFormatLen(*VogelsNumberFormatA) >= 0
VogelsNumberFormat_Copy(*VogelsNumberFormatA, VNF_Cache_A.VogelsNumberFormat)
String_To_VogelsNumberFormat(VNF_Cache_B.VogelsNumberFormat, "1")
If VogelsNumberFormat_Positive(*VogelsNumberFormatA) = #False
VogelsNumberFormat_Abs(VNF_Cache_A)
If Exponent & 1
SetVogelsNumberFormatSign(VNF_Cache_B, #VOGELS_NUMBER_FORMAT_NEGATIVE)
EndIf
EndIf
While Exponent > 0
s = 1 << z
If Exponent & s
VogelsNumberFormat_Mul(VNF_Cache_A, VNF_Cache_B, VNF_Cache_C.VogelsNumberFormat)
VogelsNumberFormat_Copy(VNF_Cache_C, VNF_Cache_B)
Exponent = Exponent - s
EndIf
If Exponent
VogelsNumberFormat_Square(VNF_Cache_A)
z = z + 1
EndIf
Wend
VogelsNumberFormat_Copy(VNF_Cache_B, *VogelsNumberFormatC)
EndIf
ResetVogelsNumberFormat(VNF_Cache_A)
ResetVogelsNumberFormat(VNF_Cache_B)
ResetVogelsNumberFormat(VNF_Cache_C)
EndProcedure
Procedure VogelsNumberFormat_Factorial(Value.l, *VogelsNumberFormatC.VogelsNumberFormat)
String_To_VogelsNumberFormat(VNF_Cache_B.VogelsNumberFormat, "1")
For Index = 2 To Value
String_To_VogelsNumberFormat(VNF_Cache_C.VogelsNumberFormat, Str(Index))
VogelsNumberFormat_Mul(VNF_Cache_B, VNF_Cache_C, VNF_Cache_R.VogelsNumberFormat)
VogelsNumberFormat_Copy(VNF_Cache_R, VNF_Cache_B)
Next
VogelsNumberFormat_Copy(VNF_Cache_B, *VogelsNumberFormatC)
ResetVogelsNumberFormat(VNF_Cache_B)
ResetVogelsNumberFormat(VNF_Cache_C)
ResetVogelsNumberFormat(VNF_Cache_R)
EndProcedure
Procedure VogelsNumberFormat_Random(*VogelsNumberFormatA.VogelsNumberFormat, MaximumDigitCount.l)
Max = Random(MaximumDigitCount)
For Index = 1 To Max
RandomNumber.s = RandomNumber + Str(Random(9))
Next
If Left(RandomNumber, 1) = "0"
RandomNumber = Right(RandomNumber, Len(RandomNumber) - 1)
EndIf
String_To_VogelsNumberFormat(*VogelsNumberFormatA, RandomNumber)
EndProcedure
Procedure ReadPreferenceVogelsNumberFormat(GroupName.s, *VogelsNumberFormatA.VogelsNumberFormat)
String_To_VogelsNumberFormat(*VogelsNumberFormatA, ReadPreferenceString(GroupName, VogelsNumberFormat_To_String(*VogelsNumberFormatA)))
EndProcedure
Procedure WritePreferenceVogelsNumberFormat(GroupName.s, *VogelsNumberFormatA.VogelsNumberFormat)
WritePreferenceString(GroupName, VogelsNumberFormat_To_String(*VogelsNumberFormatA))
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<<
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<<
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure.s FormatInteger(Number.s)
; Format Integer created by Gnozal
NumberLen = Len(Number)
Start = NumberLen % 3
FormatedNumber.s = Left(Number, Start)
For i = Start + 1 To NumberLen - Start Step 3
FormatedNumber + " " + Mid(Number, i, 3)
Next
ProcedureReturn LTrim(FormatedNumber)
EndProcedure
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug ""
String_To_VogelsNumberFormat(MyNumber.VogelsNumberFormat, "00000000000000000000123456789987654321123456789987654321")
Debug VogelsNumberFormat_To_String(MyNumber)
VogelsNumberFormat_Normalize(MyNumber)
Debug VogelsNumberFormat_To_String(MyNumber)
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug ""
String_To_VogelsNumberFormat(X.VogelsNumberFormat, "23456")
String_To_VogelsNumberFormat(Y.VogelsNumberFormat, "98765")
VogelsNumberFormat_Add(X, Y, Z.VogelsNumberFormat)
Debug VogelsNumberFormat_To_String(Z)
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug ""
String_To_VogelsNumberFormat(Number1.VogelsNumberFormat, "12345678999999994012121212155454789921999")
String_To_VogelsNumberFormat(Number2.VogelsNumberFormat, "15906045674")
VogelsNumberFormat_Mul(Number1, Number2, Number3.VogelsNumberFormat)
Debug VogelsNumberFormat_To_String(Number1) + " * " + VogelsNumberFormat_To_String(Number2) + " = " + VogelsNumberFormat_To_String(Number3)
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug ""
String_To_VogelsNumberFormat(Number.VogelsNumberFormat, "100")
VogelsNumberFormat_Pow(Number, 100, Result.VogelsNumberFormat)
Debug VogelsNumberFormat_To_String(Result)
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug ""
For Factorial = 50 To 100
VogelsNumberFormat_Factorial(Factorial, TestFactorial.VogelsNumberFormat)
Debug Str(Factorial) + "! = " + FormatInteger(VogelsNumberFormat_To_String(TestFactorial))
Next
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug ""
For RandomID = 0 To 5
VogelsNumberFormat_Random(TestRandom.VogelsNumberFormat, 25)
Debug FormatInteger(VogelsNumberFormat_To_String(TestRandom))
Next
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<