Ce code permet de convertir d'une base numéraire n à une base numéraire m. Certains codes existent déjà mais se limitent aux bases principales.
Celui là, en plus des bases décimales, binaires, octale et hexadécimal, permet de convertir dans n'importe quel base.
Source / Exemple :
<?php
class Numeration
{
//Intervalles des bases de conversion prises en compte
const MIN_BASE = 2;
const MAX_BASE = 36;
//Constantes des bases de conversion
const DECIMAL = 10;
const BINAIRE = 2;
const OCTAL = 8;
const HEXADECIMAL = 16;
//Tableau d'équivalence de conversion (jusqu'à la base 36)
private $_aConvertReference;
################################################
/**
- Constructeur.
- Initialise le tableau d'équivalence de conversion.
- /
public function __construct()
{
$this->_aConvertReference = array( 0 => '0', 1 => '1', 2 => '2', 3 => '3', 4 => '4', 5 => '5', 6 => '6', 7 => '7', 8 => '8', 9 => '9',
10 => 'A', 11 => 'B', 12 => 'C', 13 => 'D', 14 => 'E', 15 => 'F', 16 => 'G', 17 => 'H', 18 => 'I', 19 => 'J',
20 => 'K', 21 => 'L', 22 => 'M', 23 => 'N', 24 => 'O', 25 => 'P', 26 => 'Q', 27 => 'R', 28 => 'S', 29 => 'T',
30 => 'U', 31 => 'V', 32 => 'W', 33 => 'X', 34 => 'Y', 35 => 'Z' );
}
################################################
/**
- Permet de convertir un nombre d'une base quelconque à la base décimale.
- @param INTEGER $iXBase La base du nombre à convertir.
- @param INTEGER $iNumber Le nombre à convertir.
- @param BOOLEAN $bWrite Affiche le résultat.
- @return INTEGER Le nombre converti de la base $iXBase à la base décimale.
- /
public function convertXBaseToDec( $iXBase, $iNumber, $bWrite = false )
{
if( $iXBase < self::MIN_BASE || $iXBase > self::MAX_BASE )
exit( '<b>Fatal error !</b> $iXbase [' . $iXBase . '] must be between ' . self::MIN_BASE . ' and ' . self::MAX_BASE . '.' );
//On prépare le nombre à convertir
$iNumber = ltrim( $iNumber, '0' );
$iNumber = strtoupper( $iNumber );
$iNumberLength = strlen( $iNumber );
$iResConvert = 0;
//On test la possibilité de la conversion
$sKeyMax = 0;
for( $i=0; $i<$iNumberLength; $i++ )
if( array_search( $iNumber[$i], $this->_aConvertReference ) > $sKeyMax )
$sKeyMax = array_search( $iNumber[$i], $this->_aConvertReference );
if( $sKeyMax >= $iXBase )
exit( '<b>Fatal error !</b> Impossible to convert : $iNumber [' . $iNumber. '] contains invalid characters (not in $iXBase [' . $iXBase . ']).' );
//On converti
for( $i=0; $i<$iNumberLength; $i++ )
$iResConvert += array_search( $iNumber[$i], $this->_aConvertReference ) * pow( $iXBase, ($iNumberLength - $i - 1) );
//Affichage
if( $bWrite )
echo 'Résult : <b>(' . $iNumber . ')<sub>' . $iXBase . '</sub> = (' . $iResConvert . ')<sub>' . self::DECIMAL . '</sub></b><br/>';
return $iResConvert;
}
################################################
/**
- Permet de convertir un nombre de la base décimale à une base quelconque.
- @param INTEGER $iXBase La base dans laquelle on veut convertir le nombre.
- @param INTEGER $iNumber Le nombre à convertir.
- @param BOOLEAN $bWrite Affiche le résultat.
- @return INTEGER Le nombre converti de la base décimale à la base $iXBase.
- /
public function convertDecToXBase( $iXBase, $iNumber, $bWrite = false )
{
if( $iXBase < self::MIN_BASE || $iXBase > self::MAX_BASE )
exit( '<b>Fatal error !</b> $iXbase [' . $iXBase . '] must be between ' . self::MIN_BASE . ' and ' . self::MAX_BASE . '.' );
if( is_nan( $iNumber ) )
exit( '<b>Fatal error !</b> $iNumber [' . $iNumber . '] must be an integer.' );
//Initialisation des variables
$i = 0;
$bLastLoop = false;
$aRes = array();
//Conversion
$iTemp = $iNumber;
$iRes = $iNumber / $iXBase;
while( floor( $iRes ) != 0 || !$bLastLoop )
{
if( floor( $iRes ) == 0 )
$bLastLoop = true;
$aRes[$i] = $iTemp % $iXBase;
$i++;
$iTemp = $iRes;
$iRes = $iRes / $iXBase;
}
$aConvertArray = array_reverse( $aRes );
$sConvertResult = '';
for( $i=0; $i< count($aConvertArray); $i++ )
$sConvertResult .= $this->_aConvertReference[$aConvertArray[$i]];
//Affichage
if( $bWrite )
echo 'Résult : <b>(' . $iNumber . ')<sub>' . self::DECIMAL . '</sub> = (' . $sConvertResult . ')<sub>' . $iXBase . '</sub></b><br/>';
return $sConvertResult;
}
################################################
/**
- Permet de convertir un nombre d'une base quelconque à une base quelconque.
- @param INTEGER $iXBaseFrom La base du nombre à convertir.
- @param INTEGER $iXBaseTo La base dans laquelle on veut convertir le nombre.
- @param INTEGER $iNumber Le nombre à convertir.
- @param BOOLEAN $bWrite Affiche le résultat.
- @return INTEGER Le nombre converti de la base $iXBaseFrom à la base $iXBaseTo.
- /
public function convertXBaseToXBase( $iXBaseFrom, $iXBaseTo, $iNumber, $bWrite = false )
{
if( $iXBaseFrom < self::MIN_BASE || $iXBase > self::MAX_BASE )
exit( '<b>Fatal error !</b> $iXbaseFrom [' . $iXBaseFrom . '] must be between ' . self::MIN_BASE . ' and ' . self::MAX_BASE . '.' );
if( $iXBaseTo < self::MIN_BASE || $iXBase > self::MAX_BASE )
exit( '<b>Fatal error !</b> $iXbaseTo [' . $iXBaseTo . '] must be between ' . self::MIN_BASE . ' and ' . self::MAX_BASE . '.' );
$iConvert1 = $this->convertXBaseToDec( $iXBaseFrom, $iNumber );
$iConvert2 = $this->convertDecToXBase( $iXBaseTo, $iConvert1 );
//Affichage
if( $bWrite )
echo 'Résult : <b>(' . $iNumber . ')<sub>' . $iXBaseFrom . '</sub> = (' . $iConvert2 . ')<sub>' . $iXBaseTo . '</sub></b><br/>';
return $iConvert2;
}
}
?>
Conclusion :
Voila ! J'espère qu'il n'y a pas d'erreur. Si vous avez des modifications ou des remarques à apporter n'hésitez pas ;)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.