Damit die neuen Funktionen auch ohne die SysUtils klarkommen, sind noch ein paar Änderungen nötig:
- StrToInt ersetzt durch zuInteger64
- IntToStr ersetzt durch vonInteger64
- SysUtils.Uppercase konditional ersetzt durch lokales _Uppercase
Gruß,
Stefan
Delphi-Quellcode:
interface
...
private
...
function _GetZahl(const Value: Char): Integer;
function _GetZeichen(const Number: Integer): String;
{$IFNDEF VerwendeUnitSysUtils}
function _Uppercase(const input: string): string;
{$ENDIF}
implementation
...
function TMathe._GetZahl(const Value: Char): Integer;
//Char in Integer umwandeln (z.B. 'A' in 10)
//'012..89ABC...XYZ':=Array[0..36];
begin
Result := Ord(Value);
if ((Result >= Ord('0')) and (Result <= Ord('9'))) then //Zahlen von 0 bis 9
Result := Result - Ord('0')
else
if ((Result >= Ord('A')) and (Result <= Ord('Z'))) then //Buchstaben von A bis Z
Result := Result - (Ord('A') - 10)
else
Result := -1;
end;
function TMathe._GetZeichen(const Number: Integer): String;
//Integer in Char umwandeln (z.B. 10 in 'A')
//Array[0..36]:='012..89ABC...XYZ';
begin
if ((Number >= 0) and (Number <= 9)) then //Zahlen von 0 bis 9
Result := Chr(Number + Ord('0'))
else
if ((Number >= 10) and (Number <= 36)) then //Buchstaben von A bis Z
Result := Chr(Number + (Ord('A') - 10))
else
Result := '';
end;
{$IFNDEF VerwendeUnitSysUtils}
function TMathe._Uppercase(const input: string): string;
var
i: Integer;
begin
Result:=input;
for i := 1 to Length(Result) do
begin
if Result[i] in ['a'..'z'] then
result[i]:=chr(Ord(result[i]) - 32);
end;
end;
{$ENDIF}
function TMathe.ZahlNBereinigen(const ZahlN, BasisN: string): string;
//Zahl-String zur Basis N von allen Zeichen bereinigen, die nicht zwischen
// '0' und Chr(N) liegen
var
i: Integer;
ZahlN_: string;
begin
{$IFDEF VerwendeUnitSysUtils}
ZahlN_:=Uppercase(ZahlN);
{$ELSE}
ZahlN_:=_Uppercase(ZahlN);
{$ENDIF}
for i := Length(ZahlN_) downto 1 do //Rückwärts da sonst mehrfach hintereinander
//auftretende nicht erlaubte Zeichen nicht korrigiert würden
begin
if ((_GetZahl(ZahlN_[i]) < 0) or (_GetZahl(ZahlN_[i]) >= zuInteger64(BasisN))) then
Delete(ZahlN_, i, 1);
end;
Result:=ZahlN_;
end;
function TMathe.ZahlNToINT(const ZahlN, BasisN: string): string;
//Implementiert nach Horner's Algorithmus ohne Potenz-Multiplikation:
//Zahl zur Basis N mit n Ziffern: x(1)x(2)x(3)...x(n-1)x(n)
//=> Zahl zur Basis 10 := [(((x(1) * N) + x(2) ) * N + x(3) ) * N ... upto x(n-1)] + x(n)
var
i: Integer;
Zahl10: string;
ZahlN_: string;
begin
ZahlN_:=ZahlNBereinigen(ZahlN, BasisN); //CleanUp Zahl-String zur Basis N
Zahl10:='0';
try
for i := 1 to Length(ZahlN_) do
begin
Zahl10:=Summe(Produkt(Zahl10, BasisN),
vonInteger64(_GetZahl(ZahlN_[i]))); //Vorsicht: GetZahl kann -1 werden!
//Wird durch ZahlNBereinigen verhindert!
end;
except
Zahl10:='';
end;
Result:=Zahl10;
end;
function TMathe.INTToZahlN(const Zahl10, BasisN: string): string;
var
Zahl10_: string;
ZahlN: string;
Rest: string;
begin
Zahl10_:=ZahlNBereinigen(Zahl10, '10'); //CleanUp Zahl-String zur Basis 10
ZahlN:='';
try
repeat
Rest := Modulo (Zahl10_, BasisN);
Zahl10_ := Quotient(Zahl10_, BasisN);
ZahlN := _GetZeichen(zuInteger64(Rest)) + ZahlN; //Bei zu großem Rest kommt '' zurück
until Zahl10_='0';
except
ZahlN:='';
end;
Result:=ZahlN;
end;
function TMathe.ZahlNToZahlM(const ZahlN, BasisN, BasisM: string): string;
begin
Result:=INTToZahlN(ZahlNToINT(ZahlN, BasisN), BasisM);
end;