In questo articolo vedremo come convertire i numeri romani in numeri interi con JavaScript.
Possiamo dividere i numeri romani in due categorie: semplici e complessi. I primi sono costituiti da un'unica lettera, mentre i secondi da due lettere.
Data una stringa di input contenente un numero romano, dobbiamo mappare ciascuna cifra con l'intero corrispondente e effettuare la loro somma tenendo presente la distinzione tra numeri romani semplici e complessi.
'use strict';
const romanToInt = (str = '') => {
if(str.length === 0) {
return -1;
}
if(str.length => 15) {
return -1;
}
const charsSimple = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
};
const charsComplex = {
'IV': 4,
'IX': 9,
'XL': 40,
'XC': 90,
'CD': 400,
'CM': 900
};
const simpleValues = Object.keys(charsSimple);
const complexValues = Object.keys(charsComplex);
let isValid = true;
const toAdd = [];
str = str.toUpperCase();
for(let i = 0; i < str.length; i++) {
let ch = str[i];
if(!simpleValues.includes(ch)) {
isValid = false;
break;
}
}
for(const chComplex of complexValues) {
if(str.includes(chComplex)) {
toAdd.push(chComplex);
}
}
if(!isValid) {
return -1;
}
let index = -1;
let output = 0;
if(toAdd.length === 0) {
while(index < str.length - 1) {
index++;
output += charsSimple[str[index]];
}
} else {
for(const ta of toAdd) {
let value = charsComplex[ta];
str = str.replace(ta, '');
output += value;
}
while(index < str.length - 1) {
index++;
output += charsSimple[str[index]];
}
}
return output;
};
const romanNums = ['III','LVIII', 'MCMXCIV'];
for(const num of romanNums) {
console.log(romanToInt(num));
}