Écrire un montant monétaire sous forme littérale

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 621 fois - Téléchargée 15 fois

Contenu du snippet

Un essai d'écriture des montants monétaires sous forme littérale grâce à un simple script sur le poste client.

L'écriture des triplets par récurrence constitue l'originalité de ce script.

L'utilisation des expressions régulières permet de filtrer les entrées et de proposer en option l'application des recommandations de 1990.

Script à enregistrer en utf-8 pour respecter le charset de la ligne 5.

Source / Exemple :


<!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>«&nbsp;Des montants monétaires en toutes lettres&nbsp;»</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>&nbsp;<input type="text" id="ntr" onkeyup="litNbr()">&nbsp;(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()">&nbsp;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&#8217;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&#8217;euro';
  $('rsl').innerHTML=r;
}
</script>
</body>
</html>

Conclusion :


Encore une fois javascript permet de simplifier les tâches des utilisateurs.

A voir également

Ajouter un commentaire

Commentaires

alex610
Messages postés
2
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
1 mai 2011
-
peut on avoir trois chiffre apres la virgule
007Julien
Messages postés
279
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
2 -
Oui bien entendu, il suffit de modifier le code...

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
Commenter la réponse de alex610

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.