Curieux comme astuce 
 De Jérémie Le Pévédic - Vendredi 30 Août 2002 à 22:52

Je m'explique :
pour 49, ton script va renvoyer, si j'ai bien compris :
XLIX (ou XL est 40 et IX 9), alors qu'en chiffres romains, normalement, c'est IL (50-1), non ??, de même pour tous les chiffres finissant par 9.

Je peux me tromper, mais je pense qu'il y a quand même un p'tit PB.

  certes 
 De Jan Jan2 - Samedi 7 Septembre 2002 à 16:35

je ne savais pas qu'il fallait écrire IL,
où puis-je trouver les règles concernant les chiffres romains?

(si vous pouviez corriger le code pour les respecter, ça serait appréciable)

  Correction 
 De Pierre Del Perugia - Samedi 28 Septembre 2002 à 12:59

Voila un version qui utilise les regles standards. Le pb c'est qu'il n'y en a pas vraiment. Certains disent qu'il ne faut pas soustraire a M, d'autre que IIII est correcte. Et puis il y a les habitudes : 1990=MCMLXXXX au lieu de MXM (au cinema surtout).

function RomanNumber($p_iNumber)
{
if ($p_iNumber<1 || $p_iNumber>4999) return '';
//
$asDigits = array( 0=>'', 1=>'I', 2=>'V', 3=>'X', 4=>'L', 5=>'C', 6=>'D', 7=>'M');
$aiValues = array( 0=>0, 1=>1, 2=>5, 3=>10, 4=>50, 5=>100, 6=>500, 7=>1000);
//
$sResult = '';
for ($i=7; $i>=1; $i--)
{
// Repeat current digit
while ($p_iNumber >= $aiValues[$i])
{
$sResult .= $asDigits[$i];
$p_iNumber -= $aiValues[$i];
}
//
// Now try to do a substraction
for ($j=1; $j<$i; $j++)
{
// Search the smallest digit to substract
// We accept a maximum of 3 repetitions in the next loop
if ($p_iNumber >= ($aiValues[$i]-$aiValues[$j]) &&
$p_iNumber > ($aiValues[$j]+4*$aiValues[$j-1]-1)
)
{
$sResult .= $asDigits[$j] . $asDigits[$i];
$p_iNumber -= $aiValues[$i] - $aiValues[$j];
break;
}
}
}
//
return $sResult;
}