Sun, 06/09/2009 - 14:13 — horuskol
A fun little function that will produce the Roman Numeral representation for any number from 1-3999.
The reason for the limitation is because the Romans used barred letters for the number 5000 and larger, and the representation of 4000 would be MV, which is hard to represent in a simple ASCII string (maybe as an exercise to the reader, the function can be extended?).
function intToRoman($number) { if (!is_numeric($number)) { echo "Input is not a number\r\n\r\n"; return; } if ($number >= 4000) { echo "Input must be less than 4000\r\n\r\n"; return; } if ($number <= 0) { echo "Input must be greater than 0\r\n\r\n"; return; } // ensures you have a 4 digit input $number = str_pad($input['number'], 4, '0', STR_PAD_LEFT); // assign the symbols for roman numerals $numerals[3][0] = 'I'; // 1 $numerals[3][1] = 'V'; // 5 $numerals[2][0] = 'X'; // 10 $numerals[2][1] = 'L'; // 50 $numerals[1][0] = 'C'; // 100 $numerals[1][1] = 'D'; // 500 $numerals[0][0] = 'M'; // 1000 $numerals[0][1] = ''; // empty specifier, needed for looped switch $output = ''; for ($i = 0; $i <= 3; $i++) { $digit = ''; switch ($number[$i]) { case '1' : $output .= $numerals[$i][0]; $digit .= $numerals[$i][0]; break; case '2' : $output .= $numerals[$i][0] . $numerals[$i][0]; $digit .= $numerals[$i][0] . $numerals[$i][0]; break; case '3' : $output .= $numerals[$i][0] . $numerals[$i][0] . $numerals[$i][0]; $digit .= $numerals[$i][0] . $numerals[$i][0] . $numerals[$i][0]; break; case '4' : $output .= $numerals[$i][0] . $numerals[$i][1]; $digit .= $numerals[$i][0] . $numerals[$i][1]; break; case '5' : $output .= $numerals[$i][1]; $digit .= $numerals[$i][1]; break; case '6' : $output .= $numerals[$i][1] . $numerals[$i][0]; $digit .= $numerals[$i][1] . $numerals[$i][0]; break; case '7' : $output .= $numerals[$i][1] . $numerals[$i][0] . $numerals[$i][0]; $digit .= $numerals[$i][1] . $numerals[$i][0] . $numerals[$i][0]; break; case '8' : $output .= $numerals[$i][1] . $numerals[$i][0] . $numerals[$i][0] . $numerals[$i][0]; $digit .= $numerals[$i][1] . $numerals[$i][0] . $numerals[$i][0] . $numerals[$i][0]; break; case '9' : $output .= $numerals[$i][0] . $numerals[$i-1][0]; $digit .= $numerals[$i][0] . $numerals[$i-1][0]; break; } } return $output; }
Comments
Post new comment