AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

ToString: IntToStr-Ersatz

Ein Thema von implementation · begonnen am 15. Mai 2010 · letzter Beitrag vom 16. Mai 2010
 
Benutzerbild von implementation
implementation

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

ToString: IntToStr-Ersatz

  Alt 15. Mai 2010, 14: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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz