Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP : Convertir un nombre

Ma solution

Anonyme
    5 janvier 2011 à 13:56:47

    Bonjour à tous !

    Je viens de lire la Partie I du tuto concernant JavaScript de Nesquik69 et Thunderseb, et je viens de terminer le premier TP, qui consiste à réaliser un script qui permet de transformer en lettre le nombre entré par l'utilisateur. J'aimerais connaître l'avis de personnes plus expérimentés que moi en JS afin de savoir ce qui est bien, et ce qui l'est moins dans mon code.

    function conversion(nombre)
    {
        if(nombre < 0 || nombre > 999)
            return 'Veuillez entrer un nombre compris entre 0 et 999';
    	
        var unites = nombre % 10;
        var dizaines = (nombre % 100 - unites) / 10;
        var centaines = (nombre % 1000 - nombre % 100) / 100;
    	
        var unites_lettres = ['zéro', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf'];
        var dizaines_lettres = ['dix', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante', 'quatre-vingt', 'quatre-vingt'];
        var centaines_lettres = ['cent', 'deux cent', 'trois cent', 'quatre cent', 'cinq cent', 'six cent', 'sept cent', 'huit cent', 'neuf cent'];
        var nombre_speciaux_lettres = ['onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf'];
    	
        var nombre_lettres;
    	
        if(nombre == 0)
            nombre_lettres = 'zéro';
        else
        {
            if(nombre >= 11 && nombre <= 16)
            {
    	    switch(nombre)
    	    {
    	        case 11:
    		    nombre_lettres = nombre_speciaux_lettres[0];
    		    break;
    	        case 12:
    		    nombre_lettres = nombre_speciaux_lettres[1];
    		    break;
    	        case 13:
    		    nombre_lettres = nombre_speciaux_lettres[2];
    		    break;
    		case 14:
    		    nombre_lettres = nombre_speciaux_lettres[3];
    		    break;
    		case 15:
    		    nombre_lettres = nombre_speciaux_lettres[4];
    		    break;
    		case 16:
    		    nombre_lettres = nombre_speciaux_lettres[5];
    		    break;
    	    }
    	}
    		
    	else
    	{	
    	    // Traitement des centaines
    	    if(dizaines == 0 && unites == 0)
    	        nombre_lettres = centaines_lettres[centaines - 1];
    	    else
    		nombre_lettres = centaines > 0 ? centaines_lettres[centaines - 1] + '-' : '';
    		
    	    // Traitement des dizaines
    	    if(dizaines == 1 && (unites > 0 && unites <= 9))
    		nombre_lettres += nombre_speciaux_lettres[unites - 1];
    	    else if(dizaines > 0 && dizaines != 7 && dizaines != 9 && unites == 0)
    		nombre_lettres += dizaines_lettres[dizaines - 1];
    	    else if((dizaines > 0 && unites != 1) || ((dizaines == 9 || dizaines == 8) && unites == 1))
    		nombre_lettres += dizaines_lettres[dizaines - 1] + '-';
    	    else if(dizaines > 0 && dizaines != 9 && unites == 1)
    		nombre_lettres += dizaines_lettres[dizaines - 1] + '-et-';
    				
    	    // Traitement des unités
    	    if(dizaines == 1 && (unites > 0 && unites <= 9))
    	        nombre_lettres += '';
    	    else if(dizaines == 7 || dizaines == 9)
    		nombre_lettres += unites > 0 ? nombre_speciaux_lettres[unites - 1] : dizaines_lettres[unites];
    	    else
    		nombre_lettres += unites > 0 ? unites_lettres[unites] : '';
    	}
        }
    	
        return nombre_lettres;
    }
    
    do
    {
        var nombre = parseInt(prompt('Entrez un nombre entre 0 et 999 :'),10);
        if(isNaN(nombre))
    	alert('Ce n\'est pas un nombre !');
        else
    	alert(conversion(nombre));
    }while(confirm('Continuer ?'));
    


    P.S : Je ne savais pas trop quel endroit était le plus approprié pour poster mon code, soit les commentaires du tuto soit le forum, j'ai choisi le forum, j'espère que j'ai bien fais :-°
    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2011 à 16:45:26


      Rigolo comme exercice, attention, pas de tiret entre cent et un nombre, un s à quatre-vingts mais pas à quatre-vingt-un, et un s à deux cents ...

      J'ai fait un essai du coup. J'aime pas les switch ! ;)

      <script type="text/javascript" >
      	// by fa_bio - 01/2011
      	// traduit en mots les nombres de 1 à 999
      	function conversion(nombre)
      		{
      		u = new Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf");
      		d = new Array("","dix","vingt","trente","quarante","cinquante","soixante","soixante","quatre-vingt","quatre-vingt");
      		s = new Array("dix","onze","douze","treize","quatorze","quinze","seize","dix-sept","dix-huit","dix-neuf");
      		unit = nombre%10;
      		dizain = Math.floor((nombre%100)/10);
      		centain = Math.floor(nombre/100);
      		ldizain = lunit = '';
      		lcentain = (centain > 1) ? u[centain] + ' cent' : centain == 1 ? 'cent' :'' ;
      		if(dizain>1)
      			{
      			ldizain = d[dizain];
      			lunit = (dizain==7 && unit!=1)||dizain==9 ? '-' + s[unit] : dizain==7 && unit==1 ?	'-et-' + s[unit] : u[unit] ;
      			lunit = (unit!=0 && dizain!=7 && dizain!=9) ? (unit==1 && dizain<8) ? '-et-' + lunit : '-' + lunit : (dizain==8) ? lunit + 's' : lunit;  
      			}
      		else
      			{
      			if(dizain==0)
      				{
      				lunit=u[unit];
      				lcentain += unit == 0 && centain >1 ? 's': ''; 
      				}
      			else
      				ldizain=s[unit];
      			}
      		nombre_lettres=lcentain;
      		if(centain>0)
      			nombre_lettres += ' ';
      		nombre_lettres = nombre_lettres + ldizain + lunit;
      		if(dizain!=0||unit!=0)
      			nombre_lettres=nombre_lettres + ' ';
      	   return nombre_lettres;
      		}
      	for(i=1; i<1000; i++)
      		{
      		document.write(i + ' ' + conversion(i) + '<br/>');
      		}
      </script>
      


      A+



      • Partager sur Facebook
      • Partager sur Twitter
        5 janvier 2011 à 20:38:56

        @fa_bio :
        document.write(), c'est mal.
        new Array() aussi.
        Vas lire le tutoriel sur les bonnes pratiques.

        @SilkLeVoleur :
        Je préfère avec accolades (et de mémoire, c'est plus rapide avec en JS) et pour les var, tu pourrais n'en utiliser qu'un.
        var a;
        var b;
        

        =>
        var a,
        b;
        
        • Partager sur Facebook
        • Partager sur Twitter
          5 janvier 2011 à 22:32:34

          Citation : fa_bio


          Rigolo comme exercice, attention, pas de tiret entre cent et un nombre


          Les deux orthographes sont correctes.

          http://www.renouvo.org/regles.php (Point A.6)
          http://www.academie-francaise.fr/langu [...] .html#nombres (Point 2)
          • Partager sur Facebook
          • Partager sur Twitter
            7 janvier 2011 à 12:17:09

            @Golmote (Tibadibadoum)

            Tu as raison, il faut toujours privilégier la tolérance ! :p

            @xavierm02 (Futur barbu) ;)

            Tu as tort ! o_O

            Ce que tu dis est du dogmatisme !!
            Relis les bonnes pratiques et fais ce que tu dois en faire, adapte-les à tes besoins !!

            Bon courage !

            • Partager sur Facebook
            • Partager sur Twitter
              7 janvier 2011 à 14:17:45

              Hm... Il n'a pas tort... :o

              Ton code n'est pas franchement respectueux des bonnes pratiques JavaScript. Les variables ne sont même pas déclarées... :(
              • Partager sur Facebook
              • Partager sur Twitter
                7 janvier 2011 à 17:04:00

                Si, il a tort !

                Il est différent d'écrire c'est mal (sans le petit smiley qui va bien - du genre, c'est de l'humour, à pas prendre au pied de la lettre) que de dire que tu n'es pas respectueux de certaines bonnes pratiques énoncées sur le sdz !

                Les bonnes pratiques ne sont pas un truc à suivre aveuglément en toute circonstance (ce n'est d'ailleurs pas la prétention du tuto !)
                En javascript, les variables sont déclarées implicitement, après il faut écrire au concepteur du javascript ! ;)

                Pour ma part, codeur c++, je ne suis pas un fan des langages non typés !! :(

                Ici, c'est juste un bout de code marrant algorithmiquement, pas le bout de code qu'il faut recopier tel quel dans un script (d'ailleurs je suis contre cette pratique :p - différente de l'utilisation dun composant) ...

                C'est plus facile de faire le test de la fonction dans une boucle avec du document.write que de lancer un prompt pour tester toutes les écritures ! J'espère que tu me le concèdes ! :)

                Bonne journée !!



                • Partager sur Facebook
                • Partager sur Twitter
                  7 janvier 2011 à 17:48:21

                  Citation : fa_bio

                  Il est différent d'écrire c'est mal (sans le petit smiley qui va bien - du genre, c'est de l'humour, à pas prendre au pied de la lettre) que de dire que tu n'es pas respectueux de certaines bonnes pratiques énoncées sur le sdz !



                  Allons, si elles n'étaient énoncées que sur le SdZ, crois bien que je n'en ferais pas un fromage (d'ailleurs, je n'en fais pas un fromage... :euh: ). Ces "bonnes pratiques" sont approuvées par suffisamment de personnes influentes du monde du JS pour qu'on s'y intéresse.

                  Citation : fa_bio

                  Les bonnes pratiques ne sont pas un truc à suivre aveuglément en toute circonstance (ce n'est d'ailleurs pas la prétention du tuto !)


                  Je n'ai pas dit ça.

                  Citation : fa_bio

                  En javascript, les variables sont déclarées implicitement, après il faut écrire au concepteur du javascript ! ;)


                  Yep, je suis au courant. Mais elles sont déclarées... dans l'espace global. En tant que codeur C++, j'aurais cru que tu serais par conséquent attentif aux histoires de portée des variables, et tout le tintouin.

                  Citation : fa_bio

                  Pour ma part, codeur c++, je ne suis pas un fan des langages non typés !! :(


                  Je le comprends très bien. Coder avec un langage non typé est à la fois perturbant et étonnamment agréable, car beaucoup moins de contraintes... Mais qui dit moins de contraintes, dit plus de mauvaises pratiques permises...
                  Donc à défaut d'utiliser un langage rigoureux, soyons rigoureux quand on l'utilise... Parce qu'une personne laxiste qui utilise un langage laxiste... ça promet pour le code produit. :-°

                  Citation : fa_bio

                  C'est plus facile de faire le test de la fonction dans une boucle avec du document.write que de lancer un prompt pour tester toutes les écritures ! J'espère que tu me le concèdes ! :)


                  Je te le concède. Mais il suffit que tu dises "Oui, je sais que document.write() est une mauvaise pratique, mais là on s'en tape, c'est juste pour gagner du temps.". :D Moi j'aimerais juste que tu prennes conscience que oui, ce sont des mauvaises pratiques, à éviter si possible.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 janvier 2011 à 18:28:29


                    Citation : Golmote

                    Allons, si elles n'étaient énoncées que sur le SdZ, crois bien que je n'en ferais pas un fromage (d'ailleurs, je n'en fais pas un fromage... :euh: ). Ces "bonnes pratiques" sont approuvées par suffisamment de personnes influentes du monde du JS pour qu'on s'y intéresse.


                    Pour te plagier, je n'ai pas dit ça ! ;)

                    Citation : Golmote

                    Yep, je suis au courant. Mais elles sont déclarées... dans l'espace global. En tant que codeur C++, j'aurais cru que tu serais par conséquent attentif aux histoires de portée des variables, et tout le tintouin.


                    D'accord, ce n'est pas à cela que j'ai répondu (la déclaration), je suis TOUT A FAIT d'accord sur l'attention à porter sur la portée des variables !! ;)

                    Citation : Golmote

                    Parce qu'une personne laxiste qui utilise un langage laxiste... ça promet pour le code produit.


                    Ho, ça doit être rare !!! :lol:

                    Citation : Golmote

                    Je te le concède. Mais il suffit que tu dises "Oui, je sais que document.write() est une mauvaise pratique, mais là on s'en tape, c'est juste pour gagner du temps.". :D Moi j'aimerais juste que tu prennes conscience que oui, ce sont des mauvaises pratiques, à éviter si possible.



                    Je dirais plutôt, attention, là j'utilise document.write parceque cela répond bien à mon besoin mais faites gaffe, c'est pas souvent le cas !!! :D

                    En espérant que cela t'ira !! ;)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 janvier 2011 à 20:05:34

                      Citation : fa_bio

                      D'accord, ce n'est pas à cela que j'ai répondu (la déclaration), je suis TOUT A FAIT d'accord sur l'attention à porter sur la portée des variables !! ;)


                      ... Oui, j'aurais dû dire "déclarées proprement", si c'est ça que tu insinues... ?

                      Citation : fa_bio

                      Ho, ça doit être rare !!! :lol:


                      Non, ça pullule... >_<

                      Citation : fa_bio

                      Je dirais plutôt, attention, là j'utilise document.write parceque cela répond bien à mon besoin mais faites gaffe, c'est pas souvent le cas !!! :D


                      Je ne dirais pas que cela répond bien à ton besoin... Cela répond à ton besoin, certes... mais "bien"... non.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 janvier 2011 à 20:36:59

                        Je vois que mais smiley restent incompris !! snif !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 janvier 2011 à 20:55:26

                          bonjour,
                          ce qui me semble intéressant dans l'histoire c'est l'algo.
                          Après pour les bonnes pratiques c'est plus compliqué.
                          Pour les accolades c'est début et fin de bloc; s'il n'y a pas de bloc mais une seule instruction!
                          Pour document.write on arrive à l'extrême. Moi dans un script comme ça je l'utilise pour faire vite plutôt que de créer un élément et du DOM > 1.
                          Voici quelques références, certaines très officielles (W3C) avec des exemples de document.write et un contre exemple du W3C himself!
                          https://developer.mozilla.org/fr/DOM/document.write
                          http://www.w3.org/MarkUp/2004/xhtml-faq#docwrite
                          http://www.w3.org/TR/REC-html40/intera [...] html#h-18.2.4
                          Bonnes lectures :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 janvier 2011 à 20:58:35

                            Si t'utilises document.write parce que t'as la flemme d'ouvrir la console et donc que t'as pas envie de faire des console.log, c'est bon.
                            Mais si c'est un truc que tu mets sur un site, il vaut mieux passer par le DOM.

                            Regrouper les vars, ça permet de rendre le code plus court et je crois bien que c'est plus rapide. Mais c'est pas si important.

                            Et pour new Array, c'est mal, c'est tout.
                            En plus, tu peux avoir des problèmes à la con.
                            Array = false;
                            var notationLitterale = [ ],
                            notationObjet = new Array( );// CRASH
                            

                            function doIt( Array ) {
                                var notationLitterale = [ ],
                                notationObjet = new Array( );// CRASH
                            }
                            doIt( [ 0, 1 ] );
                            




                            Réponse au post ci-dessus :

                            Citation : Douglas Crockford

                            The document.write method provides a way of incorporating strings into the HTML content of the page. There are better ways to do that, such as .innerHTML and .createElement or HTML cloning patterns. Use of document.write should be avoided.

                            document.write is recklessly dependent on timing. If document.write is called before the onload event, it appends or inserts text into the page. If it is called after onload, it completely replaces the page, destroying what came before.

                            document.write encourages bad structure, in which script and markup are intermingled. A cleaner structure has minimal interaction between markup and script.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 janvier 2011 à 21:07:54

                              Citation : sicilien007

                              Pour les accolades c'est début et fin de bloc; s'il n'y a pas de bloc mais une seule instruction!


                              Mais il est préférable de toujours les mettre, afin d'améliorer la clarté du code et d'éviter des erreurs bêtes (ajout d'une ligne sans ajouter les accolades, ...).

                              Pour la notation littérale, je plussoie.

                              Pour Doug-Doug également. :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 janvier 2011 à 21:10:58

                                re,
                                pour new Array()
                                le mieux c'est de lire ECMA-262-BASES.pdf
                                Dans le cas présent ce n'était pas obligatoire mais pas dangereux.
                                @xavierm02,
                                celui qui est capable de pondre tes scripts est un fin programmeur, bien structuré, pas de convention de nommage, méconnaissance des mots réservés ...

                                Edit
                                Est-ce que tu as lu tous les docs mentionnés où justement à l'aide desquels je veux montrer, comme le dit fa_bio, qu'il faut aller dans la nuance.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  7 janvier 2011 à 21:14:38

                                  "-BASES" ? Y'a une différence avec la "ECMA-262" normale ? Si oui, un lien vers le fichier peut-être ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    7 janvier 2011 à 21:16:33

                                    re,
                                    non je ne crois pas, j'ai dû le renommer après téléchargement.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      7 janvier 2011 à 21:19:59

                                      Normalement, ton script est pas le seul sur ta page, t'es un truc Google, d'analyse de trafic ou autre.
                                      C'est d'ailleurs pour ça que l'on est pas sensé utiliser undefined et qu'il vaut mieux faire :
                                      typeof o === "undefined"
                                      

                                      ou
                                      ( function ( undefined ) {
                                         // code qui utilise undefined
                                      }( ) );
                                      


                                      Et ce sont pas des mots réservés. Ce soit des variables prédéfinies.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        7 janvier 2011 à 21:22:32

                                        @sicilien : Je comprends pas pourquoi t'as mentionné la spec d'ECMA concernant le new Array() vs [] ? Les deux y sont présents... à titre égal... :euh:
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          7 janvier 2011 à 22:02:32

                                          re,
                                          @Golmote
                                          justement il y a plusieurs façons de faire, sans distinction pour moi, d'où débat bizarre sur ce point. De toutes les façons si tu n'utilises pas new Array() JS le fera pour toi. Un peu comme var et NOT var.
                                          De plus il est toujours bon de lire les doc officielles ... après les tutos et surtout après nos interventions parfois bancales ou du moins empreintes de nos habitudes :)
                                          Enfin moi c'est ma démarche, quand j'aborde qq chose de nouveau, je lis les tutos, de préférence officiels, et puis je me plonge dans la doc officielle.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            7 janvier 2011 à 22:19:14

                                            Je lis régulièrement ECMA-262. Il s'avère qu'il est dit :

                                            Citation


                                            The production ArrayLiteral : [ Elisionopt ] is evaluated as follows:
                                            1. Let array be the result of creating a new object as if by the expression new Array() where Array is
                                            the standard built-in constructor with that name.



                                            C'est là qu'est la nuance... Ce constructeur, appelé implicitement par la notation littérale, ne peut pas être écrasé lui. Contrairement à la variable Array qui le représente...
                                            De plus, avec la notation littérale, tu gagnes en place, et le code est tout autant (voire plus) propre.
                                            Enfin, avec les crochets, on n'a pas affaire à l'aberration du constructeur qui réagit différemment si on ne lui passe qu'un seul paramètre numérique.


                                            Comment tu fais pour créer un Array avec un seul élément numérique ?

                                            var arr = new Array();
                                            arr[0] = 4;
                                            


                                            ou

                                            var arr = [4];
                                            


                                            :-°
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 janvier 2011 à 18:16:31


                                              Bon, ben super, tout le monde est d'accord ! :D
                                              Serious mode : merci pour vos comm ! Ca fait bien longtemps que je ne m'étais replongé dans de la doc de l'ECMA ! :)

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              TP : Convertir un nombre

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown