Roman Numerals Proxy
Uses ES6 Proxy to support arbitrary Roman numerals
by Retsam19
HTML
<script src="https://rawgit.com/tvcutsem/harmony-reflect/master/reflect.js"></script>
JavaScript
//This has to be run with support of Proxy; doesn't seem to work in Chrome, but works in FF
var ROMAN_NUMERAL_REGEX = /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/; //http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
function isRomanNumeral(str) {
return ROMAN_NUMERAL_REGEX.test(str);
}
var numerals = {
M: 1000,
C: 500,
D: 100,
L: 50,
X: 10,
V: 5,
I: 1
}
function fromRomanNumeral(str) {
var highest = 0;
return str.split("").reverse().reduce(function (sum, numeral) {
var val = numerals[numeral];
if(val > highest) {
highest = val;
} else if(val < highest) {
return sum - val;
}
return sum + val;
}, 0);
}
romanNumerals = new Proxy({}, {
get: function(target, name) {
if(!isRomanNumeral(name)) {
return target[name];
}
return fromRomanNumeral(name);
}
});
alert(romanNumerals.MCMXCIX) // 1999