Einzelnen Beitrag anzeigen

Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#1

ToString: IntToStr-Ersatz

  Alt 15. Mai 2010, 15:58
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.
  Mit Zitat antworten Zitat