Ihr wollt Zahlen in unterschiedlichen Stellenwertsystemen ausgeben? Dezimal, Oktal, Binär, Hexadezimal und am besten noch im 5er-, 13er- und 31er-System? Hier kommt die Universallösung:
Delphi-Quellcode:
function ToString(Val: UInt64; Alphabet:string): AnsiString;
var sub: uint64;
base: byte;
function GetChar(dgt:byte):char;
begin
Result := Alphabet[dgt+1];
end;
begin
Base := Length(Alphabet);
Result := '';
while val>0 do begin
sub := val mod base;
val := val div base;
Result := GetChar(sub)+Result;
end;
if Result='' then Result := '0';
end;
function ToString(Val: UInt64; Base: Byte): AnsiString;
const Alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
Result := ToString(Val, Copy(Alphabet, 1, Base));
end;
Und andersrum:
Delphi-Quellcode:
function ToUnsigned(Val:
string; Alphabet:
string; IgnoreCase: Boolean):UInt64;
var
factor: UInt64;
i: byte;
base: byte;
function Digit(c:char):byte;
var i: Integer;
begin
if IgnoreCase
then
c := UpCase(c);
i := Pos(c, Alphabet);
if (i=-1)
then
raise Exception.Create('
Invalid Character.');
Result := i-1;
end;
begin
base := length(Alphabet);
if IgnoreCase
then
Alphabet := Uppercase(Alphabet);
factor := 1;
Result := 0;
for i := Length(Val)
downto 1
do begin
Result := Result + factor*digit(Val[i]);
Factor := Factor * Base;
end;
end;
function ToUnsigned(Val:
string; Base: Byte): UInt64;
const Alphabet = '
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
Result := ToUnsigned(Val, Copy(Alphabet, 1, Base), true);
end;
Sind zwar beide nur für vorzeichenlose Zahlen (Byte, Word, DWord=LongWord, QWord=UInt64),
lassen sich aber schnell zu Int64 ausweiten.
Edit: += und *= ersetzt.
Edit: Alzaimar's Rat befolgt und Alphabetsangabe eingebaut.