<? // 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 />'; } ?>