Convertion

Résolu
aljessy Messages postés 36 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 4 août 2011 - 11 oct. 2010 à 13:57
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 - 16 oct. 2010 à 13:04
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

007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
11 oct. 2010 à 23:22
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");
3
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
13 oct. 2010 à 12:59
Voir aussi cette page et ses commentaires...
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
13 oct. 2010 à 19:11
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)
3
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
13 oct. 2010 à 21:19
Joli code à étudier de près ! Voici une variante qui, nous l'esperons,
devrait conjointement répondre à la question ?
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
15 oct. 2010 à 19:57
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
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
14 oct. 2010 à 18:35
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)
0
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
14 oct. 2010 à 21:55
Merci, ce devrait être réparé, je n'avais pas pensé aux zéros initiaux...
0
aljessy Messages postés 36 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 4 août 2011
15 oct. 2010 à 11:56
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?
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
15 oct. 2010 à 13:07
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)
0
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
15 oct. 2010 à 20:16
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.
0
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
16 oct. 2010 à 13:04
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...
0
Rejoignez-nous