AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ToString: IntToStr-Ersatz

Ein Thema von implementation · begonnen am 15. Mai 2010 · letzter Beitrag vom 16. Mai 2010
Antwort Antwort
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
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

Re: ToString: IntToStr-Ersatz

  Alt 15. Mai 2010, 19:04
Ein Problem hat die Routine dennoch. Wenn du ein System mit über 62 Zeichen/Ziffer hast, dann produziert die Rückwandlungsroutine schon mal Müll, sie lässt nämlich alle Zeichen größer 62 aus. Die ToString-Prozedure hat dann ein unbestimmtes Ende, es wenden dann nämlich Sonderzeichen verwendet und anfangs war das so nicht gewollt.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.052 Beiträge
 
Delphi 12 Athens
 
#3

Re: ToString: IntToStr-Ersatz

  Alt 15. Mai 2010, 19:14
Eigentlich war ich mir 101%ig sicher, daß wir schon eine Klasse (auch ohne rollstuhlfahrers Fehler) in der CL/DP hatten, aber ich finde einfach nichts.
(für Puffer statt Int64, also auch für Quellen/Ziele mit über 8 Byte)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

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

Re: ToString: IntToStr-Ersatz

  Alt 15. Mai 2010, 20:14
@himitsu:
Ich dachte auch, dass es in der Code-Library schon was dafür gab.
Umso schockierter war ich, als ich nix gefunden hab.
Da hab ich dann einfach mal die Codeauschnitte aus nem älteren Projekt rausgesucht und reingestellt.

@rollstuhlfahrer:
Ach ja, hatte ich vergessen zu erwähnen... Geht nur bis zum 36er-System, GROß- und klein-Schreibung wird ignoriert.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: ToString: IntToStr-Ersatz

  Alt 15. Mai 2010, 23:19
Die Probleme lassen sich durch Angabe des zu verwendenden Ziffernalphabets umgehen. So kann man Dualzahlen nicht nur als 0/1 schreiben, sondern z.B auch mit x und o. Wenn man denn will. Ein adäquates Alphabet für Dualzahlen wäre dann '01', 'xo', '-X' usw. Hex-Zahlen wäre dann '0123456789ABCDEF' oder auch '0123456789abcdef'.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

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

Re: ToString: IntToStr-Ersatz

  Alt 16. Mai 2010, 11:08
Gute Idee, hab ich jetzt auch umgesetzt. Danke!
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz