Soyez le premier à donner votre avis sur cette source.
Snippet vu 5 165 fois - Téléchargée 17 fois
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="fr"> <head> <title>Des nombres sous forme littérale</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <style type="text/css"> body,input {font-family:georgia;font-size:9pt;color:#000066;} body {margin:0px;padding:20px;} img {border: 0px none;} input{text-align:center;font-size:16px} #ntr{background-color:#ccc;width:140px;} #rsl {font-weight:bold;text-align:center;color:#909;font-size:16px} a {text-decoration:none;} .note{margin-top:-5px;} </style> </head> <body> <h2>« Des montants monétaires en toutes lettres »</h2> <p>Ce script donne la traduction littérale de tout montant monétaire usuel (*) assorti ou non de deux décimales annoncées par une virgule. Les montants sont supposés libellés en euros.<br></p> <p><b>Nombre à traduire sous forme littérale </b> <input type="text" id="ntr" onkeyup="litNbr()"> (les espaces de séparation facultatifs ne sont pas pris en compte)</p> <p id="rsl"></p> <p>L'usage consiste à relier les nombres inférieurs à cent par un trait d'union sauf en présence du <i>«et»</i> qui tient lieu de trait d'union. En 1990 des recommandations orthographiques, ont proposé de généraliser les traits d'union pour tous les numéraux à l'exception des noms tels que <i>«million(s)»</i> ou <i>«milliard(s)»</i> (ainsi que les <i>«millier(s)»</i>, ici et ailleurs peu usités) qui ne sont alors ni précédés, ni suivis de traits d'union.</p> <input type="checkbox" id="opt" onclick="litNbr()"> Appliquer les recommandations de 1990.<br> <hr> <p class="note">(*) C'est-à-dire inférieur à mille milliards, l'affichage de billions, trillions ou autres septillions d'euros semblant de peu d'utilité pratique.</p> <script type="text/javascript"> function $(i) {return document.getElementById(i)}; var rng,chn; function enLettres(n){rng=3;chn='';var mtf,crc; while (0<n) n=enTranche(n); chn=chn.replace("ts mille","t mille");// correction des cents et quatre-vingts mille ! chn=chn.substr(1).replace(/ /g,"-");// des traits d'union partout if ($('opt').checked) crc="(milliards?|millions?)" else crc="(milliards?|millions?|mille|cents?|et)"; mtf=new RegExp("([a-z]+)-"+crc,"ig");// sauf avant... chn=chn.replace(mtf,"$1 $2"); mtf=new RegExp(crc+"-([a-z]+)","ig");// et sauf après les mots dits. chn=chn.replace(mtf,"$1 $2"); return chn; } function enTranche(n){var r=rng,s=1,m; while (0<r--) s=s*1000;m=Math.floor(n/s); if (m!=0) switch (rng) { case 3:chn+=triplets(m)+' milliard';if (1<m) chn+='s';break; case 2:chn+=triplets(m)+' million';if (1<m) chn+='s';break; case 1:chn+=((1!=m)?triplets(m):'')+' mille';break; case 0:chn+=triplets(m);break; } rng--; return n-s*m } function triplets(n){var c,m,r; c='';r=0;s=0; if (200<=n) {m=Math.floor(n/100);c+=triplets(m)+' cent';n-=m*100} if (0==n) {c+='s';return c} if (100<=n) {c+=" cent";n-=100} if (0==n) return c; if (80<=n) {c+=' quatre-vingt';n-=80;c+=(n==0)?'s':''} if (60<=n) {c+=' soixante';n-=60;r=1;s=1} if (50<=n) {c+=' cinquante';n-=50;r=1} if (40<=n) {c+=' quarante';n-=40;r=1} if (30<=n) {c+=' trente';n-=30;r=1} if (20<=n) {c+=' vingt';n-=20;r=1} if (0==n) return c; if ((1==n && 1==r) || (11==n && s==1)) c+=' et' return c+' '+'zéro,un,deux,trois,quatre,cinq,six,sept,huit,neuf,dix,onze,douze,treize,quatorze,quinze,seize,dix-sept,dix-huit,dix-neuf'.split(/,/g)[n]; } function litNbr(){var a,z,e=$('ntr').value,n,m,r,s; n=e.replace(/[^\d,\s]+/g,'');// sans signes étrangers n=n.replace(/(,[\d]{0,2}),\d?$/g,"$1");// sans deux virgules n=n.replace(/(,\d\d)[\d,\s]+$/g,"$1");// sans plus de deux décimales if (n!=e) $('ntr').value=n; m=n.replace(/[\s]+/g,'');//sans blancs a=parseInt(m.replace(/^([\d]*)(,|\b)[\d]{0,2}$/g,"$1"));// éclaté z=m.replace(/^([\d]*)(,|\b)([\d]*)$/g,"$3"); m=m.replace(/,/g,'.'); if (12<a.toString().length) {alert("Nombre trop grand");return} if (z.toString().length==1) z+='0'; r='';if (a) {s=enLettres(a)+' euro'+((1<m)?'s ':' '); s=s.replace(/((ion|iard)s?) euro/g,"$1 d’euro");// millions et milliards d'euros ! r+=s;} if (z=parseInt(z,10)) r+=triplets(z)+' centime'+((1<z)?'s ':' '); if (!a && z) r+='d’euro'; $('rsl').innerHTML=r; } </script> </body> </html>
2 mai 2011 à 01:07
Les premières lignes de la fonction litNbr() modifient autoritairement les entrées (la ligne 76 assure la réécriture si les lignes précédentes ont modifiés l'entrée e).
La ligne 73 supprime tout ce qui n'est pas digit, virgule ou espace de séparation...
La ligne 74 m'apparaît maintenant inutile, il suffit donc de la supprimer et de modifier la ligne 75 pour ne conserver qu'au plus trois décimales après la virgule (et supprimer ainsi tout ce qui pourrait suivre) :
n=n.replace(/(,[\d]{0,3})[\d,\s]+$/g,"$1");// sans plus de trois décimales
D'autres modifications sont indispensables notamment lors de la séparation de la partie entière et des décimales :
a=parseInt(m.replace(/^([\d]*)(,|\b)[\d]{0,3}$/g,"$1"));// éclaté
Encore qu'il ne soit pas utile de détailler la partie décimale pour ne conserver que la partie entière, l'expression suivante serait donc préférable
a=parseInt(m.replace(/^([\d]*)(,|\b)[\d]*$/g,"$1"));// éclaté
Ensuite, il convient de construire un nombre de trois chiffres pour les parties décimales incomplètes (0,3 Euros doit donner 300 millimes d'Euros et 0,57 Euros doit donner 570 millimes d'Euros.
Remplacer la ligne 82 : if (z.toString().length==1) z+='0';
par while (z.toString().length<3) z+='0';
Enfin les centimes doivent donner place à des millimes à moins qu'il ne s'agisse plus d'Euros mais de toute autre grandeur mesurable...
Bonne continuation
1 mai 2011 à 07:12
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.