Convertion [Résolu]

Signaler
Messages postés
36
Date d'inscription
mercredi 16 décembre 2009
Statut
Membre
Dernière intervention
4 août 2011
-
Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
-
bjour je recherche une fonction qui prend en paramètre un réel et retour la valeur de ce réel mais cette fois ci en lettre.
Merci

11 réponses

Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
3
Pour trois chiffres, c'est facile (sans oublier que cent et vingt prennent un s au pluriel en l'absence d'unités derrière) :
function troisChifEnLet(n){var c,m,r;
    c='';r=0;s=0;
    if (200<=n) {m=Math.floor(n/100);
       c+=troisChifEnLet(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' ' + '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];
    return c;
} 

Reste à trouver la sauce pour les réels...
Ne pas oublier en fin de parcours que cent et vingt ne prennent plus d's avant mille !
chn=chn.replace("ts mille","t mille");
Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
3
Voir aussi cette page et ses commentaires...
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
Bonjour,
j'ai fini par retrouver cette source, pas mal à un petit bug ou deux prés...
Le lien sur le post d'origine afficher-nombres-toutes-lettres.

;O)
Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
3
Joli code à étudier de près ! Voici une variante qui, nous l'esperons,
devrait conjointement répondre à la question ?
Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
3
Moi qui croyais avoir bien choisi les noms de mes fonctions !

Effectivement, la première fonction appelée par le onkeyup (relèvement de la touche pressée) sur la balise input (d'identifiant ntr) est LitNbr().

Après avoir lu (e=$('ntr').value(*)) la valeur entrée, cette fonction procède à quelques remplacements pour «nettoyer» cette valeur e et la remplacer, si différente, par n (if (n!=e) $('ntr').value=n;) puis faire appel à deux reprises (la partie entière et les centimes) à la fonction principale d'écriture littérale d'un nombre entier enLettres(n) qui découpe le nombre en tranches de trois chiffres enTranches(n) pour les traiter (fonction triplets(n)) successivement (ces trois fonctions utilisent deux variables globales le rang (du triplet) rng et la chaîne construite progressivement chn dans la fonction enTranche).

Voilà pour les grandes lignes qui devraient permettre de décortiquer le source et de reprendre tout ou partie des fonctions ...

Maintenant, à partir du PHP sur le serveur, on peut toujours définir des variables par «incrustation», avec par exemple
var nombreAEcrireEnLettresSurMaPage="<?php echo $totalFactureTTC ?>";
qui permettrait de lancer la fonction dès l’ouverture
var sommeEnToutesLettres=litNbr(nombreAEcrireEnToutesLettresSurMaPage);
et d'afficher le résultat dans un paragraphe (identifié par un id="nttLtr") (Achtung script en fin du body pour que le paragraphe existe)
$('nttLtr').innerHTML = sommeEnToutesLettres;
On constate immédiatement que cette procédure (donnée pour illustrer une des possibilités d’incrustation) est lourde et inadaptée (sans compter que les tests de nettoyage seraient à supprimer).

La meilleure solution consiste, me semble-t-il, à transposer la fonction en PHP (dans un fichier de fonctions auxiliaires à inclure) ce qui présenterait le double avantage d'alléger les pages et de constituer un très bon exercice d'apprentissage et de familiarisation avec le javascript et le PHP dont l'utilisation conjuguée ouvre d'immenses possibilités y compris en comptabilité...

Quant à écrire un script générique, c'est une autre histoire pour laquelle, persuadé qu'il convient toujours d'adapter les scripts aux cas particuliers (**), je suis assez peu motivé. Ouf !

Cordialement.

(*) Voir la définition de la première fonction nommée $(i), simple raccourci pour ne pas toujours écrire document.getElementById(i) (ou document.all[i] dans un passé récent mais révolu).

(**) Là encore, j'ai repris un script datant de plusieurs années
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
Bonjour à tous,

To 007Julien:
je viens de voir ta source et un erreur de frappe, malheureusement trop fréquente chez moi, fais que je me permet de te signaler un petit dysfonctionnement.

pour exemple, nombre à tester sur les 2 sources d'ailleurs
01234567890,1

;O)
Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
3
Merci, ce devrait être réparé, je n'avais pas pensé aux zéros initiaux...
Messages postés
36
Date d'inscription
mercredi 16 décembre 2009
Statut
Membre
Dernière intervention
4 août 2011

si le nombre que je souhaite convertir se trouve déjà dans une variable, comment faire pour passer la variable en paramètre et etre sur qu'il m'affiche le resultat escompter? j'ai un peu du mal à retrouver qui fait koi dans vos code.

PS. je ne suis pas très branché javascript mais plutot php. Es ce que l'un de vous peus me dire comment appeller une fonction javascript dans un code php?
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
Bonjour,
la fonction d'entrée est litNbr(), mais je laisse 007Julien te répondre pour adapter sa source.

To 007Julien:
cela serait peut être intéressant de la déposer en l'adaptant pour en faire une source générique

;O)
Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
3
Moi qui voulait faire du genre avec de vraies apostrophes typographiques obtenues par (alt 0146 ou Alt Fn sur les portables) plutôt que des apostrophes droites (*), je m’aperçois (en voila une) que celles-ci sont transformées en entités html dans le code.

(*) Leur généralisation dans les scripts éviteraient bien des déboires. C'est possible, et l’exemple vient d’en haut avec les typographes des journaux officiels, comme dans cette décision relative aux Sables-d’Olonne.
Messages postés
276
Date d'inscription
mercredi 22 septembre 2010
Statut
Membre
Dernière intervention
8 janvier 2014
3
Tous ces développemnts n'ont pas été inutiles, il m'ont permis de constater que l'appel à la fonction enLettres() était inutile pour les centimes pour lesquels (deux chiffres seulement) la fonction triplets() est suffisante.

Il n'est alors pas nécessaire de jongler (et de faire des boucles) avec les tranches de trois chiffres pour construire la chaîne littérale en commençant par les tranches les plus lourdes...

Terminons en soulignant qu'en tirant parti des analyses et décompositions produites ou commentées, la transposition en PHP devrait pouvoir se faire sans difficultés, en élaborant les fonctions élémentaires progressivement...