![]() |
Funktion die Zahlensysteme umrechnen kann bitte testen
Hallo,
ich habe mir eine kleine Function geschrieben, die mir eine Dezimal Zahl in andere Zahlensysteme umrechnen kann. Ich bin mir nun nicht sicher, ob die funktion auch wirklich das tut, was sie soll. Könntet ihr die mal testen? Muss ich eigentlich noch prüfen, ob die Basis > 10 ist? weil es ab Basis 11 ja mit A beginnt. Oder kann ich das so machen wie ich das gemacht habe? Kann es bei einer Basis < 11 einen rest geben, der 10 oder größer ist?
Delphi-Quellcode:
MFG Christian18
function DecToX(Value, Basis : Byte) : String;
begin Result:=''; while Value > 0 do begin case Value mod Basis of 10 : Result:=Result + 'A'; 11 : Result:=Result + 'B'; 12 : Result:=Result + 'C'; 13 : Result:=Result + 'D'; 14 : Result:=Result + 'E'; 15 : Result:=Result + 'F'; else Result:=Result + IntToStr(Value mod Basis); end; Value:=Value div Basis; end; Result:=ReverseString(Result); end; |
Re: Funktion die Zahlensysteme umrechnen kann bitte testen
Also es echt witzig deinen Beitrag zu lesen.
Ich hätte das ein wenig anders gemacht. Denn eine Basis > 16 ist durchaus auch denkbar
Delphi-Quellcode:
Diese Variante dürfte bis Basis 26 gehn, ist aber so aus dem Kopf gecoded ..function DectoX(Value:Integer;Basis):String; var t:Integer; begin Result := ''; if Value < 0 then begin Result := '-'; value := - Value; end; while Value > 0 do begin t := Value Mod Basis; if t < 10 then result := Result + inttostr(t) else Result := Result + chr(55+T); Value := Value div Basis; end; end; |
Re: Funktion die Zahlensysteme umrechnen kann bitte testen
@Christian18: deinen Code kann man noch vereinfachen bzw. das case verallgemeinern, ähnlich wie es Corpsman gemacht hat.
@Corpsman: bei dir ist der String nachher falsch herum. Anstatt den String nachher rumzudrehen, kann man ihn aber gleich anders herum zusammen stellen. Außerdem kommt bei euch beiden bei einer 0 ein leerer String heraus. Mein Vorschlag:
Delphi-Quellcode:
Das ist getestet und es funktioniert!
function DecToX(Value: Cardinal; const Basis: Byte): String;
function GetChar(const b: Byte): Char; begin if b < 10 then Result := Chr(b + 48) else Result := Chr(b + 55); end; begin if (Basis < 2) or (Basis > 36) then raise Exception.Create('Basis ' + IntToStr(Basis) + ' wird nicht unterstützt.'); Result := ''; repeat Result := GetChar(Value mod Basis) + Result; Value := Value div Basis; until Value = 0; end; Ach ja, noch das ganze umgekehrt:
Delphi-Quellcode:
function XToDec(s: String; const Basis: Byte): Cardinal;
function GetDec(const c: Char): Byte; begin if c in ['0'..'9'] then Result := Ord(c) - 48 else if c in ['A'..'Z'] then Result := Ord(c) - 55 else if c in ['a'..'z'] then Result := Ord(c) - 87 else raise Exception.Create('Zeichen "' + c + '" wird nicht unterstützt.'); end; var i, j: Cardinal; begin if (Basis < 2) or (Basis > 36) then raise Exception.Create('Basis ' + IntToStr(Basis) + ' wird nicht unterstützt.'); Result := 0; if s = '' then s := '0'; j := 1; for i := Length(s) downto 1 do begin Result := Result + GetDec(s[i]) * j; j := j * Basis; end; end; |
Re: Funktion die Zahlensysteme umrechnen kann bitte testen
Hier auch noch ein Vorschlag...
Delphi-Quellcode:
Für HEX:
function zahl_to_dez(zahl:string; basis:byte; erlaubte_zeichen:string):integer;
var exponent:byte; faktor:integer; begin exponent:=0; Result:=0; repeat faktor:=pos(copy(zahl, length(zahl) - exponent, 1), erlaubte_zeichen)-1; Result:=round(Result + faktor * exp(exponent*ln(basis))); inc(exponent); until exponent = length(zahl); end;
Delphi-Quellcode:
und andersherum...
dez:=zahl_to_dez('FF', 16, '0123456789ABCDEF');
Delphi-Quellcode:
Für HEX:
function dez_to_zahl(dez_zahl:word; basis:byte; erlaubte_zeichen:string):string;
var teil_ergebnis:integer; begin Result:=''; repeat Result:=erlaubte_zeichen[(dez_zahl mod basis)+1] + Result; dez_zahl:=dez_zahl div basis; until dez_zahl = 0; end;
Delphi-Quellcode:
Gruss
hex:=dez_to_zahl(255, 16, '0123456789ABCDEF');
Thorsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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