Voilà si ca t'interesse la classe (l'utilisation en bas du message) :
class Nb
{
/*
** Calcul le résultat d'une expression numérique en gérant les nombres infinis.
** Attention le résultat est une chaine de caractère, ne pas convertir en (int) !
*/
function calcul($str)
{
$str = str_replace(array(' ', "\n", "\t"), array('', '', ''), $str);
$str = str_replace(array('+-', '--'), array('-', '+'), $str);
while (preg_match('/^([0-9]+)([\+\-\*\/%]+)([0-9]+)/si', $str, $match))
{
switch ($match[2])
{
case "+" :
$result = $this->operation_add($match[1], $match[3]);
break;
case "-" :
$result = $this->operation_sub($match[1], $match[3]);
break;
}
$str = preg_replace('/^([0-9]+)([\+\-\*\/%]+)([0-9]+)/si', (string)$result, $str);
$str = str_replace(array('+-', '--'), array('-', '+'), $str);
}
return ($str);
}
/*
** Opération sur deux nombres
*/
function operation_add($nb1, $nb2)
{
$len1 = strlen($nb1);
$len2 = strlen($nb2);
$max = max($len1, $len2);
$final = '';
$retenu = 0;
for ($i = 0; $i < $max; $i++)
{
$c1 = ($len1 - $i - 1 >= 0) ? $nb1{$len1 - $i - 1} : 0;
$c2 = ($len2 - $i - 1 >= 0) ? $nb2{$len2 - $i - 1} : 0;
$result = (string)($c1 + $c2 + $retenu);
if (strlen($result) == 2)
{
$final = $result{1} . $final;
$retenu = 1;
}
else
{
$final = $result{0} . $final;
$retenu = 0;
}
}
return ((($retenu == '1') ? '1' : '') . $final);
}
/*
** Soustraction sur deux nombres
*/
function operation_sub($nb1, $nb2)
{
$len1 = strlen($nb1);
$len2 = strlen($nb2);
$max = max($len1, $len2);
$final = '';
$retenu = 0;
$neg = FALSE;
for ($i = 0; $i < $max; $i++)
{
$c1 = ($len1 - $i - 1 >= 0) ? $nb1{$len1 - $i - 1} : 0;
$c1 = (string)($c1 - $retenu);
$c2 = ($len2 - $i - 1 >= 0) ? $nb2{$len2 - $i - 1} : 0;
if ($c1 >= $c2)
{
$retenu = 0;
$result = (string)($c1 - $c2);
}
else
{
if ($i == $max - 1)
{
$neg = TRUE;
$result = (string)abs($c1 - $c2);
}
else
{
$retenu = 1;
$result = (string)(($c1 + 10) - $c2);
}
}
$final = $result . $final;
}
return ((($neg) ? '-' : '') . $final);
}
}
Pour l'utilisation :
[php]$nb = new Nb();
$result = $nb->calcul('99999999999999999999999999999999999999999+1');
echo $result;
// Affiche : 100000000000000000000000000000000000000000[/php]
Par contre pour le moment seuls les + et les - sont gérés (pas de parenthèse, ni de *, / et %).
A toi de voir si tu souhaites utiliser la classe mais bon autant gérer les nombres infinis ^^