graemo
05-06-2003, 04:42 PM
can anyone talk me through step by step the code for this converter
any help greatly appreciated!!
cheers
var lastChanged;
var lastDone;
var lastString;
var canAlert = true;
function setLastChanged(field){
lastChanged = field;
lastDone = null;
canAlert=true;
}
function calcNumerals(){
var last = lastDone;
if (last == null){
last = lastChanged;
}
lastDone = last;
if (last.value == ""){
document.numerals.arabic.value = "";
document.numerals.roman.value = "";
return;
}
if (last == document.numerals.arabic){
var arabicInt = parseInt(last.value);
if ("" + arabicInt == "NaN"){
if (canAlert){
alert("That's not a number!");
}
canAlert = false;
last.focus();
last.select();
return;
}
if (arabicInt <= 0){
if (canAlert){
alert("Roman numerals can't be less than one.");
}
canAlert = false;
last.focus();
last.select();
return;
}
if (arabicInt >= 10000){
if (canAlert){
alert("That number is too big to be converted.");
}
canAlert = false;
last.focus();
last.select();
return;
}
document.numerals.roman.value = AtoR(arabicInt);
} else if (last == document.numerals.roman){
var r = RtoA(last.value);
if (r == -1){
if (canAlert){
alert("That doesn't appear to be a valid roman numeral.");
}
canAlert = false;
last.focus();
last.select();
return;
}
document.numerals.arabic.value = r;
document.numerals.roman.value = AtoR(r);
}
}
function set(field, text){
(eval(field)).value = text;
setLastChanged(eval(field));
calcNumerals();
window.scroll(0,0);
}
function RtoA(s){
var c;
var c1;
var v;
var v1;
var arabic = 0;
for(i=0; i<s.length; i++){
c = s.charAt(i);
v = getValue(c);
if (v == -1){
return -1;
}
if (i+1 < s.length){
c1 = s.charAt(i+1);
} else {
c1 = '!';
}
v1 = getValue(c1);
if (v1>v){
arabic += v1-v;
i++;
} else {
arabic += v;
}
}
if (arabic < 10000){
return (arabic);
} else {
return (-1);
}
}
function getValue(c){
var result = -1;
switch (c){
case 'M':{
result = 1000;
} break;
case 'D':{
result = 500;
} break;
case 'C':{
result = 100;
} break;
case 'L':{
result = 50;
} break;
case 'X':{
result = 10;
} break;
case 'V':{
result = 5;
} break;
case 'I':{
result = 1;
} break;
}
return result;
}
function AtoR(i){
var roman = "";
var arabic = i;
while (arabic - 1000 >= 0){
roman += "M";
arabic -= 1000;
}
while (arabic - 900 >= 0){
roman += "CM";
arabic -= 900;
}
while (arabic - 500 >= 0){
roman += "D";
arabic -= 500;
}
while (arabic - 400 >= 0){
roman += "CD";
arabic -= 400;
}
while (arabic - 100 >= 0){
roman += "C";
arabic -= 100;
}
while (arabic - 90 >= 0){
roman += "XC";
arabic -= 90;
}
while (arabic - 50 >= 0){
roman += "L";
arabic -= 50;
}
while (arabic - 40 >= 0){
roman += "XL";
arabic -= 40;
}
while (arabic - 10 >= 0){
roman += "X";
arabic -= 10;
}
while (arabic - 9 >= 0){
roman += "IX";
arabic -= 9;
}
while (arabic - 5 >= 0){
roman += "V";
arabic -= 5;
}
while (arabic - 4 >= 0){
roman += "IV";
arabic -= 4;
}
while (arabic -1 >= 0){
roman += "I";
arabic -= 1;
}
return (roman);
}
any help greatly appreciated!!
cheers
var lastChanged;
var lastDone;
var lastString;
var canAlert = true;
function setLastChanged(field){
lastChanged = field;
lastDone = null;
canAlert=true;
}
function calcNumerals(){
var last = lastDone;
if (last == null){
last = lastChanged;
}
lastDone = last;
if (last.value == ""){
document.numerals.arabic.value = "";
document.numerals.roman.value = "";
return;
}
if (last == document.numerals.arabic){
var arabicInt = parseInt(last.value);
if ("" + arabicInt == "NaN"){
if (canAlert){
alert("That's not a number!");
}
canAlert = false;
last.focus();
last.select();
return;
}
if (arabicInt <= 0){
if (canAlert){
alert("Roman numerals can't be less than one.");
}
canAlert = false;
last.focus();
last.select();
return;
}
if (arabicInt >= 10000){
if (canAlert){
alert("That number is too big to be converted.");
}
canAlert = false;
last.focus();
last.select();
return;
}
document.numerals.roman.value = AtoR(arabicInt);
} else if (last == document.numerals.roman){
var r = RtoA(last.value);
if (r == -1){
if (canAlert){
alert("That doesn't appear to be a valid roman numeral.");
}
canAlert = false;
last.focus();
last.select();
return;
}
document.numerals.arabic.value = r;
document.numerals.roman.value = AtoR(r);
}
}
function set(field, text){
(eval(field)).value = text;
setLastChanged(eval(field));
calcNumerals();
window.scroll(0,0);
}
function RtoA(s){
var c;
var c1;
var v;
var v1;
var arabic = 0;
for(i=0; i<s.length; i++){
c = s.charAt(i);
v = getValue(c);
if (v == -1){
return -1;
}
if (i+1 < s.length){
c1 = s.charAt(i+1);
} else {
c1 = '!';
}
v1 = getValue(c1);
if (v1>v){
arabic += v1-v;
i++;
} else {
arabic += v;
}
}
if (arabic < 10000){
return (arabic);
} else {
return (-1);
}
}
function getValue(c){
var result = -1;
switch (c){
case 'M':{
result = 1000;
} break;
case 'D':{
result = 500;
} break;
case 'C':{
result = 100;
} break;
case 'L':{
result = 50;
} break;
case 'X':{
result = 10;
} break;
case 'V':{
result = 5;
} break;
case 'I':{
result = 1;
} break;
}
return result;
}
function AtoR(i){
var roman = "";
var arabic = i;
while (arabic - 1000 >= 0){
roman += "M";
arabic -= 1000;
}
while (arabic - 900 >= 0){
roman += "CM";
arabic -= 900;
}
while (arabic - 500 >= 0){
roman += "D";
arabic -= 500;
}
while (arabic - 400 >= 0){
roman += "CD";
arabic -= 400;
}
while (arabic - 100 >= 0){
roman += "C";
arabic -= 100;
}
while (arabic - 90 >= 0){
roman += "XC";
arabic -= 90;
}
while (arabic - 50 >= 0){
roman += "L";
arabic -= 50;
}
while (arabic - 40 >= 0){
roman += "XL";
arabic -= 40;
}
while (arabic - 10 >= 0){
roman += "X";
arabic -= 10;
}
while (arabic - 9 >= 0){
roman += "IX";
arabic -= 9;
}
while (arabic - 5 >= 0){
roman += "V";
arabic -= 5;
}
while (arabic - 4 >= 0){
roman += "IV";
arabic -= 4;
}
while (arabic -1 >= 0){
roman += "I";
arabic -= 1;
}
return (roman);
}