Base converting/fr

From Free Pascal wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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.