User:Rical/valeurDeRomain.js
Appearance
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)
- Edge: Hold Ctrl while clicking Refresh, or 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>
*/