Base converting/fr

From Free Pascal 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.