Base converting/fr
From Lazarus wiki
Jump to navigationJump to search
│
English (en) │
français (fr) │
Cette unité vous permettra de passer d'une base de numération à une autre, chaque base est choisie dans l'intervalle 2..36.
unit BaseConvert;
interface
function IntToBaseStr(Value, BaseOut: integer): String;
function BaseStrToInt(Value: String; BaseIn: Integer): Integer;
function BaseToBase(ValueIn: String; baseIn, BaseOut: Integer): String;
implementation
resourceString
rsBadBase = 'Base %d invalide, elle doit être comprise entre'
+' %d et %d';
rsBadDigitInValue = 'Mauvais chiffre %s dans la valeur, base = %d';
const
Digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
// Exprime la valeur dans la base voulue.
function IntToBaseStr(Value, BaseOut: integer): String;
var
rmndr: integer; // reste
begin
// validité de la base ?
if not InRange(BaseOut, 2, Length(Digits)) then
raise ERangeError.CreateFmt(rsBadBase, [BaseOut, 2, length(Digits)]);
// Décomposition de la valeur, la variable prend à chaque fois la valeur du diviseur
// L'instruction repeat permet de tenir compte de la valeur 0
Result := '';
repeat
divmod(Value, BaseOut, Value, rmndr);
Result := Digits[rmndr+1] + Result;
until Value = 0;
End;
// Transforme la chaîne d'un nombre exprimé dans la base paramètre en l'entier équivalent.
// Si la chaîne est vide, le résultat est 0.
// Attention : Pas de vérification de dépassement d'entier. il faut utiliser des valeurs raisonnables
function BaseStrToInt(Value: String; BaseIn: Integer): Integer;
var
d: Char;
digit: Integer;
begin
Result := 0;
for d in Value do
begin
digit := Pos(d, Digits) - 1;
if not InRange(digit, 0, BaseIn-1) then
raise ERangeError.CreateFmt(rsBadDigitInValue, [d, BaseIn]);
Result := Result * BaseIn + digit;
end;
End;
// Conversion directe de nombre exprimé dans une base vers une autre
function BaseToBase(ValueIn: String; baseIn, BaseOut: Integer): String;
begin
// le cas BaseIn=BaseOut n'est volontairement pas traité de manière spécifique
// en vue des tests unitaires.
Result := IntToBaseStr(BaseStrToInt(ValueIn, BaseIn), BaseOut);
End;
End.