Der ursprüngliche Code stammt von Rob.
Habe aber die Parameterprüfung und den Speed so verbessert,
dass die es sich eigentlich lohnt ihn hier so posten.
Vielleicht braucht den Code ja jemand.
Was macht der Code..
Er konvertiert jede Stringzahl mit einer Basis zwischen 2 und 36
in eine Stringzahl mit einer anderen Basis(2 bis 36). Wenn die Zahl
Zeichen enthält die die Basis nicht erlaubt oder eine zugroße/zukleine
Basis übergeben wird, gibt die Procedure -1 zurück. Daher sollte man
den Rückgabewert vorher prüfen, wie ich es weiter unten getan habe.
Code: Alles auswählen
Procedure.s MultiConvert(Zahl.s,in_basis.l,out_basis.l) ;kovertiert jede Stringzahl in ein anderes Zahlensystem
Protected l.l, ziffer.s, i.l, ziffer_l.l, dec.l, ASC_Wert.l, ergebnis.s, rest.l, rest_s.s
Zahl = UCase(Trim(Zahl))
l = Len(Zahl)
;Prüfen ob die Zahlensystembereiche eingehalten wurden und ob, ein String übergeben wurde
If l > 0 And 1 < in_basis And in_basis < 37 And 1 < out_basis And out_basis < 37
;Prüfung ob die Zeichen in der angegeben Basis erlaubt sind und wenn ja werden sie im
;Dezimalsystem ausgegeben und addiert
If in_basis < 11
For i = 0 To l-1
ziffer = Mid(Zahl, l-i,1)
If 47 < Asc(ziffer) And Asc(ziffer) < 58
dec + Val(ziffer) * Pow(in_basis,i)
Else
ProcedureReturn "-1"
EndIf
Next
Else
For i = 0 To l-1
ziffer = Mid(Zahl, l-i,1)
ASC_Wert = Asc(ziffer)
If 47 < ASC_Wert And ASC_Wert < 58
dec + Val(ziffer) * Pow(in_basis,i)
ElseIf 64 < ASC_Wert And ASC_Wert < 91
dec + (ASC_Wert-55) * Pow(in_basis,i)
Else
ProcedureReturn "-1"
EndIf
Next
EndIf
;wenn Ausgabebasis 10 ist muss nicht mehr gerechnet werden, denn
;die Zahl wird ja immer zuerst ins Dezimalsystem umgerechnet
If out_basis = 10
ergebnis = Str(dec)
Else ;ansonsten muss die Zahl berechnet werden
Repeat
rest = dec % out_basis
dec / out_basis
If rest > 9
rest_s = Chr(55 + rest)
Else
rest_s = Str(rest)
EndIf
ergebnis + rest_s
Until dec = 0
EndIf
ProcedureReturn ergebnis ;die Zahl wird an das Hauptprogramm zurückgegeben
EndIf
ProcedureReturn "-1"
EndProcedure
Zahl.s = "ff" ;die Zahl muss zur Basis passen sonst gibt die Procedure -1 zurück
in_basis.l = 16 ;in_basis und out_basis müssen größer als 1
out_basis.l = 10 ;und kleiner als 37 sein
Zahl = MultiConvert(Zahl,in_basis,out_basis)
If Zahl <> "-1"
Debug Zahl
EndIf
End