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 ;)
ceci dit quand on passe d'un language à un autre, il est parfois plus rapide de réecrire des choses qui existent que de chercher dans un manuel parmis des miliers de fonctions plus ou moins bien documentées celle qui nous eviterait d'écrire 3 lignes basiques, il en va de même pour la politique de masquage des données dans les variables et parametres de fonctions, mais merci avous deux AlphaOrionis et jeca, j'en prend note ;-)
<?php
$valeur = 3;
echo str_pad(base_convert(3, 10, 2), 8, '0', STR_PAD_LEFT);
//-- affiche : 00000011 -------------
?>
Dans tous les cas, les fonctions natives sont plus rapides. Et pourquoi écrire dix lignes quand une seule suffit ?
Pour ta fonction, cette ligne est inutile : $newstr=$pstr;
$pstr est déjà une variable locale, prend juste soin de lui donner un nom unique. ;)
Aussi je me demandais peut on editer de telles fonctions?(je suis sous windows avec easyphp)existe t'il un répertoire contenant les classes built-in, ou sont elles compilées et sont elles plus rapides en termes d'execution qu'une classe ecrite à la main qui contiendrait exactement le même code?
en l'occurence si je voulais que convertDecToXBase( 2, 3, false) retourne '00000011' et non '11' vaut'il mieux?:
1)ecrire une fonction style
function completechaine($pstr,$d){
$newstr=$pstr;
while(strlen($newstr)<$d){$newstr="0".$newstr;}
return $newstr;
}
et faire completechaine(decbin(3),8)
ou
2)
récrire une classe comme nicof3 en ajoutant un parametre pour la longueur de la chaine retournée?
Merci d'avance pour vos suggestions
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.