Romanize-deromanize functions
Roman Numeral Converter
function Romanize(num) {
var lookup = {M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1},
roman = '',
i;
for ( i in lookup ) {
while ( num >= lookup[i] ) {
roman += i;
num -= lookup[i];
}
}
return roman;
}
var romanized = romanize (1862);
var deromanized = deromanize ("MCMLXXVIII");
function romanize (num) {
if (!+num)
return false;
var digits = String(+num).split(""),
key = ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
"","I","II","III","IV","V","VI","VII","VIII","IX"],
roman = "",
i = 3;
while (i--)
roman = (key[+digits.pop() + (i * 10)] || "") + roman;
return Array(+digits.join("") + 1).join("M") + roman;
}
function deromanize (str) {
var str = str.toUpperCase(),
validator = /^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/,
token = /[MDLV]|C[MD]?|X[CL]?|I[XV]?/g,
key = {M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1},
num = 0, m;
if (!(str && validator.test(str)))
return false;
while (m = token.exec(str))
num += key[m[0]];
return num;
}
Arabic to roman by Kenshi Muto
function arabic2roman(s)
{
var n = Number(s);
var v = "";
var i = ["", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix"];
var x = ["", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc"];
var c = ["", "c", "cc", "ccc", "cd", "d", "dc", "dcc", "dccc", "cm"];
var m = ["", "m", "mm", "mmm", "mmmm"];
if (n >= 1 && n <= 4999) {
v += m[Math.floor(n / 1000)];
n %= 1000;
v += c[Math.floor(n / 100)];
n %= 100;
v += x[Math.floor(n / 10)];
n %= 10;
v+= i[n];
}
return v;
}
Roman to arabic by Kenshi Muto
function roman2arabic(s)
{
var i = 0;
var v = 0;
var n, c;
s = s.toLowerCase();
if (s.charAt(i) == "m") {
for (n = 0; s.charAt(i) == "m"; n++) i++;
if (n > 4) return 0;
v += n * 1000;
}
if (s.charAt(i) == "d" || s.charAt(i) == "c") {
if ((c = s.charAt(i)) == "d") {
i++;
v += 500;
}
if (c == "c" && s.charAt(i + 1) == "m") {
i += 2;
v += 900;
} else if (c == "c" && s.charAt(i + 1) == "d") {
i += 2;
v += 400;
} else {
for (n = 0; s.charAt(i) == "c"; n++) i++;
if (n > 4) return 0;
v += n * 100;
}
}
if (s.charAt(i) == "l" || s.charAt(i) == "x") {
if ((c = s.charAt(i)) == "l") {
i++;
v += 50;
}
if (c == "x" && s.charAt(i + 1) == "c") {
i += 2;
v += 90;
} else if (c == "x" && s.charAt(i + 1) == "l") {
i += 2;
v += 40;
} else {
for (n = 0; s.charAt(i) == "x"; n++) i++;
if (n > 4) return 0;
v += n * 10;
}
}
if (s.charAt(i) == "v" || s.charAt(i) == "i") {
if ((c = s.charAt(i)) == "v") {
i++;
v += 5;
}
if (c == "i" && s.charAt(i + 1) == "x") {
i += 2;
v += 9;
} else if (c == "i" && s.charAt(i + 1) == "v") {
i += 2;
v += 4;
} else {
for (n = 0; s.charAt(i) == "i"; n++) i++;
if (n > 4) return 0;
v += n;
}
}
return (s.charAt(i) == "" && v >= 1 && v <= 4999) ? v : 0;
}
Roman to arabic script based on the function above
