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