Full version: jsB@nk » Calculation » Equivalent » Roman Numerals Converter
URL: https://www.javascriptbank.com/roman-numerals-converter.html
An interesting script for converting between integers and Roman Numerals, as well as checking the validity of Roman Numerals for common mistakes.
Full version: jsB@nk » Calculation » Equivalent » Roman Numerals Converter
URL: https://www.javascriptbank.com/roman-numerals-converter.html
<script> /************************************************************* * Thesh Ooter's Roman Numeral Convertor * * * * For converting between integers and Roman Numerals as well * * as checking the validity of Roman Numerals and correcting * * some common Roman Numeral mistakes. * * * * This script should work with any web browser that supports * * ECMAScript V3 (specifically try and catch) and the DOM2 * * method 'getElementById()'; this has been tested to work * * in IE5+ and Mozilla 1.7 (although it should work with * * earlier versions, it is untesed) as well as Opera 7.5. I * * do not have access to a KHTML based browser like Safari or * * Konqueror, but I expect this to work in recent versions. * * * * This script was written by Scott Hulberg (AKA Thesh Ooter) * * [email protected] * *************************************************************/var undefined; //needed for this to work in IE5 /*********************************** * These first arrays are used by * * the functions which convert * * roman numerals into integers. * ***********************************/var counter = new Array(7);var romans = new Array(7);romans["I"] = 1;romans["V"] = 5;romans["X"] = 10;romans["L"] = 50;romans["C"] = 100;romans["D"] = 500;romans["M"] = 1000;var subs = new Array(4);subs["I"] = true;subs["X"] = true;subs["C"] = true;subs["M"] = true; /*********************************** * This next array stores the data * * needed to convert integers into * * roman numerals. * ***********************************/var getChar = new Array(7);getChar[0] = "I";getChar[1] = "V";getChar[2] = "X";getChar[3] = "L";getChar[4] = "C";getChar[5] = "D";getChar[6] = "M"; /*********************************** * This first function is a pretty * * simple and generic function used * * to define and throw errors * ***********************************/ function createError(ErrorName, ErrorMessage) { var theError = new Error(); theError.name = ErrorName; theError.message = ErrorMessage; throw theError; } /*********************************** * These next four functions are * * used to test for errors in the * * input and convert roman numerals * * into integers. * ***********************************/function checkRom(Rcur, Rnext, lSub, n, l) {if ((romans[Rcur] == undefined) || ((romans[Rnext] == undefined) && ((n + 1) < l))) {createError("InputError", "Not a Roman Numeral");}else if (romans[Rcur] >= lSub) {createError("InputError", "Not a Properly Formed Numeral");}}function testSub(cR, nR, pR) {if (romans[cR] < romans[nR]) {if ((romans[pR] == romans[nR]) && (subs[nR] != true)) {createError("InputError", "Not a Properly Formed Numeral");}else if ((subs[cR] == true) && (10*romans[cR] >= romans[nR])) {return true;}else {createError("InputError", "Not a Properly Formed Numeral");}}return false;}function testRom(rome) {if (counter[rome] < 3) {return true;}else {createError("InputError", "Not a Properly Formed Numeral");}return false;}function parseRomanToInt(rNumb, strict) {counter["I"] = 0;counter["V"] = 2;counter["X"] = 0;counter["L"] = 2;counter["C"] = 0;counter["D"] = 2;counter["M"] = Number.NEGATIVE_INFINITY;var intNumb = 0;var lastNumb = Number.POSITIVE_INFINITY;var thisNumb = 0;var lastSub = Number.POSITIVE_INFINITY;rNumb = rNumb.toString().toUpperCase()for (var i=0; i<rNumb.length; i++) {var currentR = rNumb.charAt(i);var nextR = rNumb.charAt(i + 1);var prevR = rNumb.charAt(i - 1);try {if (strict != false) {checkRom(currentR, nextR, lastSub, i, rNumb.length);if (testSub(currentR, nextR, prevR) == true) {thisNumb = (romans[nextR] - romans[currentR]);i++;lastSub = romans[currentR];}else if (testRom(currentR) == true){thisNumb = romans[currentR];counter[currentR]++;}if (thisNumb > lastNumb) {createError("InputError", "Not a Properly Formed Numeral");}else {intNumb += thisNumb;lastNumb = thisNumb;}}else {if ((romans[currentR] == undefined) || ((romans[nextR] == undefined) && ((i + 1) < rNumb.length))) {createError("InputError", "Not a Roman Numeral");}else if (romans[currentR] < romans[nextR]) {thisNumb = (romans[nextR] - romans[currentR]);i++;}else {thisNumb = romans[currentR];}intNumb += thisNumb;}}catch(e) {intNumb = e.name + ": " + e.message;break;}}return intNumb;} /*********************************** * The next two functions are used * * for converting an integer into a * * roman Numeral. * ***********************************/function ints(pos, iValue) {var charValue = "";var s = 2*pos;if (pos > 2) {for (var i=0; i<iValue*Math.pow(10,(pos-3)); i++) {charValue += "M";}}else if (iValue < 4) {for (var i=0; i<iValue; i++) {charValue += getChar[s];}}else if (iValue == 4) {charValue = getChar[s] + getChar[s+1];}else if (iValue < 9) {charValue = getChar[s+1];for (var i=0; i<iValue-5; i++) {charValue += getChar[s];}}else if (iValue == 9) {charValue = getChar[s] + getChar[s+2];}return new String(charValue);}function parseIntToRoman(intNumb, whichError) {var romNumb;var romNumbFinal = "";if ((parseInt(intNumb, 10) != intNumb) || (parseInt(intNumb,10) < 0)) {try {if (whichError == 0) {createError("InputError", "Cannot create a valid Roman Numeral");}else {createError("InputError", "Not a positive Integer");}}catch(err) {romNumbFinal = err.name.toString() + ": " + err.message.toString();}}else {intNumb = parseInt(intNumb, 10).toString();for (var k=0; k<intNumb.length; k++) {var currentI = parseInt(intNumb.charAt(intNumb.length - (k + 1)));romNumb = romNumbFinal;romNumbFinal = ints(k, currentI) + romNumb;}}return romNumbFinal;} /*********************************** * These next functions are used to * * interact with the input in the * * forms in the page - modify as * * needed. * ***********************************/function convertRoman() {var rominput = document.getElementById("roman").value;document.getElementById("number").value = parseRomanToInt(rominput, true);}function convertToRoman() {var intput = document.getElementById("number").value;document.getElementById("roman").value = parseIntToRoman(intput, 1);}//The next function should fix common mistakes, and at least put out a valid numeralfunction correctRoman() {var wrongput = document.getElementById("roman2").value;document.getElementById("roman").value = parseIntToRoman(parseRomanToInt(wrongput, false), 0);}</script><!-- This script downloaded from www.JavaScriptBank.com Come to view and download over 2000+ free javascript at www.JavaScriptBank.com-->
<form style="text-align: left; width: 50%;"><p>Decimal:<br /><input id="number" type="text" style="width: 30%"> <input type="button" onClick="convertToRoman()" value="Convert"></p><p>Roman:<br /><input id="roman" type="text" style="width: 30%"> <input type="button" onClick="convertRoman()" value="Convert"></p><p>Correct a Roman Numeral:<br /><input id="roman2" type="text" style="width: 30%"> <input type="button" onClick="correctRoman()" value="Convert"> <input type="reset" value="Reset" /></p></form><!-- This script downloaded from www.JavaScriptBank.com Come to view and download over 2000+ free javascript at www.JavaScriptBank.com-->