Robson » Code » PHP » Roman Number

 
<?
   // roman number convert/deconverter v1.0
   
   // only works with valid roman numbers and only returns valid roman numbers
 
   // roman numbers and normal numbers
   $natural_roman = array(1000 => 'M', 500 => 'D', 100 => 'C', 50 => 'L', 10 => 'X', 5 => 'V', 1 => 'I');
   
   // convert to our numbers
   function to_natural($numeral)
   {
       global $natural_roman;
       $numeral = str_replace(
                               array('CM', 'CD', 'XC', 'XL', 'IX', 'IV'),
                               array('DCCCC', 'CCCC', 'LXXXX', 'XXXX', 'VIIII', 'IIII'),
                               trim($numeral)
                           );                        
       for ($total = 0, $n = 0; $n < strlen($numeral); $n++)
       {
           if ($numeral[$n] == 'I' && $n <> strlen($numeral)-1 && $numeral[$n+1] <> 'I')
               $number = array_search($numeral[++$n], $natural_roman)-1;
           else
               $number = array_search($numeral[$n], $natural_roman);
           $total += $number;
       }
       return $total;
   }
   
   // convert to roman numbers
   function to_roman($natural)
   {
       global $natural_roman;
       reset($natural_roman);
       while (list($key, $value) = each($natural_roman))
       {
           while ($natural >= $key)
           {
               $natural -= $key;
               $rn .= $value;
           }
       }
       return str_replace(
                               array('DCCCC', 'CCCC', 'LXXXX', 'XXXX', 'VIIII', 'IIII'),        
                               array('CM', 'CD', 'XC', 'XL', 'IX', 'IV'),
                               $rn
                           );        
   }
   
   // * example use - show roman numbers for 1 to 500 and then convert back * //
   
   for ($n = 1; $n <= 500; $n++)
   {
       $rom = to_roman($n);
       $nat = to_natural($rom);
       echo $n . ' = ' . $rom . ' = ' . $nat . '<br />';
   }
   
?>
 
© 2004-17 robson | cc unless stated