Convertisseur chiffres romains à chiffres arabes

Quand on lit des dates en chiffres romains il peut être agaçant et incertains de faire la conversion en chiffres arabes.

En effet, nous n’avons pas l’habitude de manier les chiffres romains quotidiennement. De surcroît, le passage des chiffres romains au chiffres arabes s’est réaliser parce qu’il était plus simple de manipuler les chiffres arabes que les chiffres romains.

Comme quoi, on a su dans le passé simplifier un système !

Le but de notre programme est simple :

On entre un nombre romain (sous la forme d’une chaîne de caractères) et il en ressort l’équivalent en nombre arabe (sous forme d’un nombre entier).

Bon tout d’abord dans notre programme on va s’assurer qu’il n’y a pas de mauvaises entrées. On va donc réaliser une fonction qui vérifiera que chaque caractère correspond bien à un chiffre romain :

const isRomanNumber = (stringNumber) => {
  const romanNumbers = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
  const romanArray = stringNumber.split('')
  const notRomanElement = romanArray.filter((element) => !romanNumbers.includes(element))
  return notRomanElement.length != 0 ? false : true
}

Ainsi si notre nombre romain n’est pas valable, et bien on retournera null :

  if (!isRomanNumber(stringNumber)) {
    return null
  }

Ensuite il nous faut une table de conversion (là se sera plutôt un objet de conversion). Cela me permet aussi de réaliser l’économie de vous expliquer comment fonctionne les chiffres romain.

const convertionObj = {
  I: 1,
  IV: 4,
  V: 5,
  IX: 9,
  X: 10,
  XL: 40,
  L: 50,
  XC: 90,
  C: 100,
  CD: 400,
  D: 500,
  CM: 900,
  M: 1000,
}

Et pour finir voici la fonction qui regroupe le tout :

const romanToInt = (stringNumber) => {
  if (!isRomanNumber(stringNumber)) {
    return null
  }

  const specificRomanNumbers = ['IV', 'IX', 'XL', 'XC', 'CD', 'CM']
  const romanNumbers = stringNumber.split('')
  let number = 0
  let i = 0
  while (i < romanNumbers.length) {
    if (specificRomanNumbers.includes(romanNumbers[i] + romanNumbers[i + 1])) {
      number += convertionObj[romanNumbers[i] + romanNumbers[i + 1]]
      i += 2
    } else {
      number += convertionObj[romanNumbers[i]]
      i += 1
    }
  }
  return number
}

Donc comme on l’a déjà vu plus haut, on s’assure que c’est bien un nombre romain. Et puis on transforme la chaîne de caractères en tableau.

On initialise le nombre qu’on va renvoyer à 0;

Puis après on va parcourir chaque élément du tableau pour ajouter au nombre sa valeur associée.

Le point particulier c’est que dans un cas on aura qu’un seul symbole. C’est le cas pour : I, V, X, L, C, D et M.

Dans ce cas là, on réalise un pas de 1.

Et dans un autre cas on aura 2 symboles. C’est le cas pour : IV, IX, XL, XC, CD et DM.

Il importe donc de repérer ces cas particulier :

const specificRomanNumbers = ['IV', 'IX', 'XL', 'XC', 'CD', 'CM']
  [...]
  while (i < romanNumbers.length) {
    if (specificRomanNumbers.includes(romanNumbers[i] + romanNumbers[i + 1])) {
      [...]

Et dans le cas là on réalise un pas de 2.

Puis voici comment je teste le programme :

const test1 = 'III' // 3
const test2 = 'IV' // 4
const test3 = 'IX' // 9
const test4 = 'LVIII' // 58
const test5 = 'MCMXCIV' // 1994
const test6 = 'DEVS' // null

console.log('### ROMAN TO INTEGERS ###')
console.log(`${test1} => ${romanToInt(test1)}`)
console.log()
console.log(`${test2} => ${romanToInt(test2)}`)
console.log()
console.log(`${test3} => ${romanToInt(test3)}`)
console.log()
console.log(`${test4} => ${romanToInt(test4)}`)
console.log()
console.log(`${test5} => ${romanToInt(test5)}`)
console.log()
console.log(`${test6} => ${romanToInt(test6)}`)
console.log()
Pour marque-pages : Permaliens.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *