Roman/Arabic Numeral Converter (PHP/Javascript/jQuery)
By | Thursday, December 1, 2011


Hide CommentsType in either a number or a Roman Numeral





PHP:
<?php

$roman = strtoupper('MMXI');
$arabic = '2011';

//ROMAN/ARABIC CONVERSION TABLE
$r = array("I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "M", "MM", "MMM", "MMMM");
$n = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 2000, 3000, 4000);

//ROMAN NUMERAL PATTERN FOR VALIDITY
$roman_pattern = '^(M{1,4})?'.
'(CD|CM|D?C{0,3})?'.
'(XL|XC|L?X{0,3})?'.
'(IV|IX|V?I{0,3})?$';

//IF ROMAN NUMERAL IS VALID, IT'LL CONVERT TO THE NEW SYSTEM
if(eregi($roman_pattern, $roman, $group)){
for($i=1; $i<count($group); $i++){
for($j=0; $j<count($r); $j++){
//CONVERSION PROCESS
if($group[$i]==$r[$j]){
$nn += $n[$j];
}
}
}
echo 'Arabic: '.$nn.' '; //DISPLAYS NUMBER
}
//IF NUMBER < 5000, IT'LL CONVERT TO A ROMAN NUMERAL
if($arabic<5000){
$astrlen = strlen($arabic);
for($i=0; $i<$astrlen; $i++){
$e = ($astrlen-1)-$i; //REVERSE THE ORDER FOR EACH DIGIT

$digit = $arabic[$i];
$place = pow(10, $e); //EXPONENT FOR EACH DIGIT
$place_value = $digit*$place; //PLACE VALUE TO BE COMPARED WITH THE NUMBER ARRAY
//CONVERSION PROCESS
for($j=0; $j<count($n); $j++){
if($place_value==$n[$j]){
$rr .= $r[$j];
}
}
}
echo 'Roman: '.$rr; //DISPLAYS ROMAN

}
else
{
echo 'Number must be less than 5000';
}

?>
jQuery
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
function convert(numeral, l){//NUMBER & ITS CHAR LENGTH, FROM INPUT TAG
//NUMBER PATTERN FOR VALIDITY
var num = /^[0-9]+$/;
//ROMAN NUMERAL PATTERN FOR VALIDITY
var roman = /^(M{1,4})?(CD|CM|D?C{0,3})?(XL|XC|L?X{0,3})?(IV|IX|V?I{0,3})?$/i;

//ROMAN/ARABIC CONVERSION TABLE
r = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "M", "MM", "MMM", "MMMM"];
n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 2000, 3000, 4000];

//IF ROMAN NUMERAL IS VALID, IT'LL CONVERT TO THE NEW SYSTEM
if(numeral.match(roman)){
var converted = 0;
var numeral = numeral.toUpperCase();
var group = roman.exec(numeral); //GROUPS THE PATTERN
//CONVERSION PROCESS
for(i=1; i<group.length; i++){
for(j=0; j<r.length; j++){
if(group[i]==r[j]){
converted += n[j];
}
}
}
}
{
if(numeral.match(num)){
var converted = '';
//IF NUMBER < 5000, IT'LL CONVERT TO A ROMAN NUMERAL
if(numeral>0&&numeral<5000){
for(i=0; i<l; i++){
var digit = numeral[i];
var e = (l-1)-i; //REVERSE THE ORDER FOR EACH DIGIT

var place = Math.pow(10, e); //EXPONENT FOR EACH DIGIT
var pv = digit*place; //PLACE VALUE TO BE COMPARED WITH THE NUMBER ARRAY

//CONVERSION PROCESS
for(j=0; j<n.length; j++){
if(pv==n[j]){
converted += r[j];
}
}
}
}
}
{
converted = 'Invalid number';
}
}
$("#numeral").html(converted); //DISPLAYS WHICHEVER IS NOT IN THE INPUT

}
</script>
<body>
<input onKeyUp="convert(this.value, this.value.length)"><br>
<span id="numeral"></span>
</body>
</html>