User:Rical/valeurDeRomain.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/*! 01/05/2012 14:41 calcul de valeur de nombre romain pour http://fr.wikisource.org/ */
// voir la documentation en fin de script, exemples d'appels :
// roman2int('MCXI');
// testerUnRomain('MMMMCMXCIX', 'span.vueromains', 'Erreur :'); 
// testerDesRomains('span.vueromains');

function roman2int(r, err) {
	if ( r ) { r = ''+r; } else { r = ''; }; // anti null, to text
	if ( err ) { err = ''+err; } else { err = ''; }; // anti null, to text
	var v=0; var v1=0; var v2=0; var v3=0; // valeurs totale, de derniere lettre, et precedentes
	var x='-'; var i=0; // caractere courant et son numéro
	var lst='-MDCLXVIJ'; // liste des chiffres romains
	var e0=''; var e1=''; var e2=''; var e3=''; var e4=''; // erreurs detectables
	while (x!='') {
		v3=v2; v2=v1; v1=0;
		x=r.substr(i,1);
		if ( x=='M' ) { v1=1000 };
		if ( x=='D' ) { v1=500 };
		if ( x=='C' ) { v1=100 };
		if ( x=='L' ) { v1=50 };
		if ( x=='X' ) { v1=10 };
		if ( x=='V' ) { v1=5 };
		if ( x=='I' ) { v1=1 };
		if ( x=='J' ) { v1=1; 
			if ( i < (r.length-1) ) {e4=' caractere J avant la fin.';}
		};
		v+=v1;
		if ( (v1==5*v2) | (v1==10*v2) ) {v-=2*v2}; // pour ajuster 4, 9, 40, 90 ...
		if ( lst.indexOf(x) < 1 ) {e3=' caractere '+x+' en '+(i+1)+'.';};
		if ( (v1>v2) & (v2>v3) ) {e2=' caracteres croissants.';};
		i+=1;
		x=r.substr(i,1);
	};
	if ( v == 0) {e0=' valeur nulle.';};
	if ( v > 4999) {e1=' valeur > 4999.';};
	if ( ( e0+e1+e2+e3+e4 > '' ) && ( err > '' ) ) { 
		err = ''+v+ err +e0+e1+e2+e3+e4; // sortie avec les erreurs
	} else { 
		err = ''+v; // sortie sans les erreurs
	};
	return err; // avec ou sans erreurs
} // function roman2int(r, err)

function i2r(i, j) {
	var rm='';
	if ( i == 1000 ) { rm = 'M' };
	if ( i == 500 ) { rm = 'D' };
	if ( i == 100 ) { rm = 'C' };
	if ( i == 50 ) { rm = 'L' };
	if ( i == 10 ) { rm = 'X' };
	if ( i == 5 ) { rm = 'V' };
	if ( i == 1 ) { 
		rm = 'I';
		if ( j == 'J' ) {  rm = 'J' };
	};
	return rm;
} // function i2r(i, j)

function int2roman(i, err) {
	if ( i == null ) { i = 0; }; // anti null
	i = i.valueOf();
	if ( err ) { err = ''+err; } else { err = ''; }; // anti null, to text
	var v100 = 100; var v500 = v100*5; var v1000 = v100*10; // cycle romain 1000, 100, 10, 1
	var v=0; var v1=0; var v2=0; var v3=0; // valeurs totale, derniere, et precedentes
	var reste=0; var reduction=0; // reste a convertir, derniere reduction
	//var x='-'; var i=0; // caractere courant et son numéro
	//var lst='-MDCLXVIJ'; // liste des chiffres romains
	var rm=''; var roman=''; // chiffre et nombre romain resultant
	var e0=''; var e1=''; var e2=''; var e3=''; var e4=''; // erreurs detectables
	if ( i > 4999 ) {
		e1 = ' valeur > 4999.';
		roman = 'ERREUR';
		i = 0;
	}; 
	if ( i < 1 ) {
		e2 = ' valeur < 1.';
		roman = 'ERREUR';
		i = 0;
	}; 
	reste = i;
	// return ' test '; // temporaire
	while (reste > 0) {
		v3 = v2; v2 = v1; v1 = reste;
		reduction = 0;
		if ( reste >= v1000 ) { 
			reduction = v1000; 
		} else if ( reste >= v100*9 ) { 
			reduction = v100; 
			reste = reste + v100*2; 
		} else if ( reste >= v500 ) { 
			reduction = v500; 
		} else if ( reste >= v100*4 ) { 
			reduction = v100; 
			reste = reste + v100*2; 
		} else if ( reste >= v100 ) { 
			reduction = v100; 
		} else if ( reste >= 1000 ) { 
			v100 = 100; v1000 = 1000; reduction = v1000; 
		};
		rm = i2r(reduction);
		roman = roman + rm;
		reste = reste - reduction;
		if ( reste < v100 ) { 
			if ( v100 >= 10 ) { 
				v100 = v100/10; v500 = v100*5; v1000 = v100*10;
			};
		};
	};
	//if ( v == 0) {e0=' valeur nulle.';};
	//if ( v > 4999) {e1=' valeur > 4999.';};
	if ( ( e0+e1+e2+e3+e4 > '' ) && ( err > '' ) ) { 
		err = '' + roman + err +e0+e1+e2+e3+e4; // sortie avec les erreurs
	} else { 
		err = '' + roman; // sortie sans les erreurs
	};
	return err; // avec ou sans erreurs
	return roman; // + reste;
} // function int2roman(in, err)

function testerUnRomain(r1, vue, err) {
	var rm = int2roman(r1);
	var i = roman2int(rm);
	$(vue).append(' - '+r1+'='+rm+'='+i ); 
}

function erreurUnRomain(r1, vue, err) {
	var rer = roman2int(r1, err);
	$(vue).append(' - '+r1+'='+rer ); 
}

function testerDesRomains(vue) {
	var err = ' Erreur :'; 
	testerUnRomain( 12, vue, err); 
	testerUnRomain( 1111, vue, err); 
	testerUnRomain( 1444, vue, err); 
	testerUnRomain( 1555, vue, err); 
	testerUnRomain( 1666, vue, err); 
	testerUnRomain( 1999, vue, err); 
	testerUnRomain( 2222, vue, err); 
	testerUnRomain( 3333, vue, err); 
	testerUnRomain( 4444, vue, err); 
	testerUnRomain( 4555, vue, err); 
	testerUnRomain( 4666, vue, err); 
	testerUnRomain( 4777, vue, err); 
	testerUnRomain( 4888, vue, err); 
	testerUnRomain( 4999, vue, err); 
	testerUnRomain( 5000, vue, err); 
	testerUnRomain( 0, vue, err); 
	//return;
	// Nombres avec erreurs
	erreurUnRomain('ERREURS', vue, err); 
	erreurUnRomain('XIA', vue, err); 
	erreurUnRomain('XIA', vue, err); 
	erreurUnRomain('XJI', vue, err); 
	erreurUnRomain('IXC', vue, err); 
	erreurUnRomain('VLD', vue, err); 
	erreurUnRomain('MMMMM', vue, err); 
	erreurUnRomain('MMMMMYJXC', vue, err); 
	erreurUnRomain('MMMMMYJXC', vue, err); 
}

/* 22/04/2012 15:35 Le script ci-dessus donne le resultat suivant :
[ bouton Calculs de romains ] Nombres romains : XIJ=12 MCXI=1111 MCDXLIV=1444 MDCLXVI=1666 MCMXCIX=1999 MMCCXXII=2222 MMMMCMXCIX=4999 ERREURS=0 erreur caractere S en 7. XIA=11 erreur caractere A en 3. XJI=12 erreur caractere J avant la fin. IXC=89 erreur caracteres croissants. VLD=445 erreur caracteres croissants. MMMMM=5000 erreur > 4999. MMMMMYJXC=5089 erreur > 4999. erreur caractere Y en 6. erreur caractere J avant la fin.

Le test consiste à placer les fichiers calculromain.html, calculromain.js et jquery.js dans un même dossier.
Puis à lancer calculromain.html et à cliquer sur le bouton [ Calculs de romains ]

Le fichier calculromain.html contient exactement :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- Tester un script de calcul de valeur de nombre romain -->
<html lang="fr-fr">
<head>
  <meta http-equiv="Content-Type" content="text/html">
  <title> valeurDeRomain </title>
  <script type="text/javascript" src="jquery.js"></script>
  <script type="text/javascript" src="calculromain.js"></script>
</head>
<body>
  <button type="button" onclick="testerDesRomains('span.vueromains');" > Calculs de romains </button>
  <button type="button" onclick="$('span.vueromains').html(' Nombres romains : ');" > raz </button>
  <span class="vueromains" > Nombres romains : </span>
</body>
</html>
*/