Base converting

From Free Pascal wiki
Revision as of 18:58, 21 January 2018 by Kai Burghardt (talk | contribs) (removed trailing white space; added hint to binStr, octStr, str, hexStr in system uni)
Jump to navigationJump to search

English (en) français (fr)

This unit will allow you to switch from one number base to another, each base is chosen in the range 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.

For your information: For bases two, eight, ten, and sixteen, you can use binStr, OctStr, str and hexStr from the automatically included system unit.