Jeg har også, på det amatør-javascript-niveau jeg er på, forsøgt med lidt javascript :o)
De 2 øverste funktioner er til romertal <-> decimaltal og er baseret på noget Object Pascal-kode jeg har liggende. Den øverste er baseret på
http://borrisholt.com/Faq/ShowSource.asp?id=34&Array=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, og nr. 2 har jeg selv skrevet :o)
De 2 nederste er til et talsystem <-> decimaltal, og virker på følgende måde (eksempler):
anyBaseToDec('FF', 16) == 255;
decToAnyBase(255, 16) == 255;
Altså:
anyBaseToDec(tal som talsystem, talsystem) == tal som decimaltal;
decToAnyBase(tal som decimaltal, talsystem) == tal som decimaltal;
function decToRoman(dec) {
var i, result = "";
romans = new Array("I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M");
arabics = new Array(1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
for (i = romans.length - 1; i >= 0; i--)
while (dec >= arabics[i]) {
dec = dec - arabics[i];
result += romans[i];
}
if (result.length == 0)
return false;
return result;
}
function romanToDec(romanNum) {
var i, j, index, max = 0, result = 0;
romans = new Array("I", "V", "X", "L", "C", "D", "M");
arabics = new Array(1, 5, 10, 50, 100, 500, 1000);
romanNum = romanNum.toUpperCase();
for (i = romanNum.length - 1; i >= 0; i--) {
index = -1;
for (j = 0; j < romans.length; j++)
if (romans[j] == romanNum.charAt(i)) {
index = j;
break;
}
if (index == -1)
return false;
if (arabics[index] >= max) {
max = arabics[index];
result += arabics[index];
} else
result -= arabics[index];
}
if (result == 0)
return false;
return result;
}
function anyBaseToDec(num, base) {
var i, result = 0, minus = false;
baseStr = "0123456789abcdefghijklmnopqrstuvwxyz";
if (base < 2 || base > baseStr.length)
return false;
baseStr = baseStr.substr(0, base);
if (num.length == 0)
return false;
num = num.toLowerCase();
if (num.indexOf("-") == 0) {
minus = true;
num = num.substr(1, num.length - 1);
}
for (i = 0; i < num.length; i++) {
if (baseStr.indexOf(num.charAt(i)) == -1)
return false;
result += baseStr.indexOf(num.charAt(i)) * Math.pow(base, num.length - i - 1);
}
if (minus)
result = -result;
return result;
}
function decToAnyBase(dec, base) {
var i, result = "", minus = false;
baseStr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (isNaN(dec))
return false;
if (base < 2 || base > baseStr.length)
return false;
baseStr = baseStr.substr(0, base);
if (dec < 0) {
minus = true;
dec = -dec;
}
do {
result = baseStr[dec % base] + result;
dec = parseInt(dec / base);
} while (dec > 0);
if (result.length == 0)
return false;
if (minus)
result = "-" + result;
return result;
}