Uses
SysUtils, Math;
Type
TNumeralSystem = ( nsBin, nsDec, nsHex );
// Unsere Zahlensysteme
Const
cDisplayDigits:
Array[ 0..15 ]
Of Char = ( '
0', '
1', '
2', '
3', '
4', '
5', '
6', '
7', '
8', '
9', '
a', '
b', '
c', '
d', '
e', '
f' );
// Buchstaben alle klein!
Function GetNSSize(
Const NummeralSystem: TNumeralSystem ): Integer;
//** Wieviel Zahlen hat das System
Begin
Case NummeralSystem
Of
nsBin: Result := 2;
nsDec: Result := 10;
nsHex: Result := 16;
Else Result := -1;
End;
End;
Function CheckNSString(
Const NumeralSystemString:
String;
Const NummeralSystem: TNumeralSystem ): Boolean;
//** entspricht der String der Notation des Zahlensystems (Ungültige Zeichen???)
Var i: Integer;
a: Integer;
ConvStr:
String;
IOResult: Boolean;
Begin
Result := False;
If Length( NumeralSystemString ) > 0
Then Begin
ConvStr := LowerCase( NumeralSystemString );
// Großbuchstaben zu Kleinbuchstaben wandeln
IOResult := False;
For i := 1
To Length( ConvStr )
Do Begin // Jedes Zeichen des übergeben Strings durchgehen
IOResult := False;
For a := 0
To GetNSSize( NummeralSystem ) - 1
Do Begin // cDisplayDigits durchgehen
IOResult := ConvStr[ i ] = cDisplayDigits[ a ];
If IOResult
Then Break;
// For Schleife abbrechen wenn Zeichen übereinstimmen
End;
If Not IOResult
Then Break;
// Abbrechen wenn ein Zeichen nicht gefunden wurde...
End;
Result := IOResult;
End;
End;
Function GetDecValue(
Const aChar: Char ): Integer;
//** Zeichen zu dezimalen Wert
Var i: Integer;
FoundOne: Boolean;
Begin
Result := -1;
For i := Low( cDisplayDigits )
To High( cDisplayDigits )
Do Begin
FoundOne := cDisplayDigits[ i ] = aChar;
If FoundOne
Then Begin
Result := i;
Break;
End;
End;
If Not FoundOne
Then Raise EConvertError.Create( '
Wert für das Numerische Zeichen: "' + aChar + '
" kann nicht ermittelt werden' );
End;
Function ConvertToDec(
Const SrcNumStr:
String;
Const SrcNumSys: TNumeralSystem ): Int64;
//** Konvertiert eine Zahl eines Systems zu einer Dezimalzahl
Var ConvStr:
String;
Len: Integer;
i: Integer;
NV: Int64;
Begin
If SrcNumSys <> nsDec
Then Begin // Nur aufwendig konvertieren, wenn Anfangssystem nicht Dezimal
Result := 0;
ConvStr := LowerCase( SrcNumStr );
// Großbuchstaben zu Kleinbuchstaben wandeln
Len := Length( ConvStr );
For i := 0
To Len - 1
Do Begin
NV := Trunc( IntPower( GetNSSize( SrcNumSys ), i ) );
// passende Potentz ermitteln
Result := Result + ( GetDecValue( ConvStr[ Len - i ] ) * NV );
// Wert ausrechnen und zum Ergebniss hinzufügen...
End;
End Else Begin
Result := StrToInt64( SrcNumStr );
End;
End;
Function NumeralSystemConvert(
Const SrcNumStr:
String;
Const SrcNumSys, DestNumSys: TNumeralSystem ):
String;
//** Konvertiert eine Zahl eines Systems in ein anderes Zahlensystem
Var ConvStr:
String;
DecConv: Int64;
DestP: Integer;
Begin
Result := '
';
ConvStr := LowerCase( SrcNumStr );
// Großbuchstaben zu Kleinbuchstaben wandeln
If CheckNSString( ConvStr, SrcNumSys )
Then Begin
If Not ( SrcNumSys = DestNumSys )
Then Begin
Try
DecConv := ConvertToDec( ConvStr, SrcNumSys );
If DestNumSys <> nsDec
Then Begin // Wir haben schon ein dezimales Ergebniss, deshalb nur bei nicht dezimalen Zielsystem berechnen...
DestP := GetNSSize( DestNumSys );
While DecConv <> 0
Do Begin
Result := cDisplayDigits[ DecConv
Mod DestP ] + Result;
DecConv := DecConv
Div DestP;
End;
End Else Begin
Result := IntToStr( DecConv );
End;
Except
On Error:
Exception Do Begin
Result := '
ERROR: "' + Error.
Message + '
"';
End;
End;
End Else Begin
Result := ConvStr;
// gleiches Zahlensystem brauch nicht umgewandelt werden...
End;
End Else Begin
Result := '
ERROR: Zeichenfolge konnte wegen ungültiger Zeichen nicht umgerechnet werden.';
End;
End;