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

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

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.