Accueil > Développement web > Les pages dynamiques avec PHP/MySQL > Exemples de fonctions PHP > Transformer un nombre (entier naturel) en sa description textuelle
124 visites

Transformer un nombre (entier naturel) en sa description textuelle

dimanche 1er juillet 2018

Version imprimable de cet article Version imprimable

// transforme un nombre en sa description textuelle
function num2txt($num){
        $res=($num<0)?"moins":"";
        $tabchiffres=array("","un","deux","trois","quatre","cinq","six","sept","huit","neuf");         // commence à zéro !
        $tabdix=array("","onze","douze","treize","quatorze","quinze","seize");                        // idem
        $tabdizaines=array("","dix","vingt","trente","quarante","cinquante","soixante");        // idem
        $trnum=number_format($num); // pas de partie décimale, une , entre chaque millier
        $tabnum=explode(",",$trnum);
        $puiss=count($tabnum); // 1 = entre 0 et 999, 2 = entre 1000 et 999 999 milliers, 3 = entre 1 000 000 et 999 999 999 milions, 4 =...
        $tabpuis=array("","","mille","million","milliard"); // centaine/dizaine de milliards, centaine/dizaine de million, centaine/dizaine de millier, centaine/dizaine/unité
        foreach ($tabnum as $milnum){
                $taillenum=strlen($milnum);
                $res.=($res!="")?" ":"";
                $verrounite=false;
                if ($taillenum==3) { // si 3 chiffres, traiter centaines
                        // si 0 = rien, sinon x cent(s)
                        if ($milnum[0]==1){
                                $res.="cent";
                        }
                        if ($milnum[0]>1){
                                $res.=$tabchiffres[$milnum[0]]." cent";
                                $res.=(($milnum[1]>0)||($milnum[2]>0)||($puiss>=2))?"s":"";
                        }
                }
                if ($taillenum>=2) { // si 2 chiffres, traiter dizaines
                        $pos=($taillenum==3)?1:0;
                        $res.=($res!="")?" ":"";
                        //$res.=($pos!=0)?" ":"";
                        $next=$pos+1;
                        // si 1
                        if ($milnum[$pos]==1){
                                if (($milnum[$next]>=1)&&($milnum[$next]<=6)){
                                        // onze à seize
                                        $res.=$tabdix[$milnum[$next]];
                                        $verrounite=true;
                                }else{
                                        // 0 +        si 7 à 9 = dix-
                                        $res.=$tabdizaines[1];
                                        $res.=($milnum[$next]>=7)?"-":"";
                                }
                        }
                        // si 2 à 6
                        if (($milnum[$pos]>1)&&($milnum[$pos]<7)){
                                $res.=$tabdizaines[$milnum[$pos]];
                                $res.=($milnum[$next]>0)?"-":"";
                        }
                        // si 7, 8 et 9 qui utilisent aussi le chiffre des unités
                        if ($milnum[$pos]==7){
                                $res.="soixante";
                                if ($milnum[$next]==0){ $res.="-dix"; }
                                if ($milnum[$next]==1){ $res.=" et onze"; }
                                if (($milnum[$next]>=2)&&($milnum[$next]<=6)){ $res.="-".$tabdix[$milnum[$next]]; }
                                if ($milnum[$next]>=7){ $res.="-dix-".$tabchiffres[$milnum[$next]]; }
                                $verrounite=true;
                        }
                        if ($milnum[$pos]==8){
                                //$verrounite=true;
                                $res.="quatre-vingt";
                                if ($milnum[$next]>1){ $res.="-"; }
                        }
                        if ($milnum[$pos]==9){
                                $res.="quatre-vingt";
                                if ($milnum[$next]==0){ $res.="-dix"; }
                                if (($milnum[$next]>=1)&&($milnum[$next]<=6)){ $res.="-".$tabdix[$milnum[$next]]; }
                                if ($milnum[$next]>=7){ $res.="-dix-".$tabchiffres[$milnum[$next]]; }
                                $verrounite=true;
                        }
                }
                if ($taillenum>=1) { // si 1 chiffres
                        $pos=$taillenum-1; // dernier chiffre 2-1 = 1 ? 3-1=2
                        if ($pos==0){
                                // 1 seul chiffre, donc si >1 ou 1 et puiss = 1, afficher le chiffre
                                $res.=(($milnum>1)||(($milnum==1)&&($puiss==1)))?$tabchiffres[$milnum]:"";
                        }else{       
                                if ((!$verrounite)&&($milnum[$pos]!=0)){ // si chiffre dizaine != 7, 8 ou 9
                                        $pre=$pos-1;
                                        if ($milnum[$pre]==0){
                                                $res.=$tabchiffres[$milnum[$pos]];
                                        }
                                        // si dizaine
                                        if ($milnum[$pre]==1){
                                                // déjà un tiret
                                                $res.=$tabchiffres[$milnum[$pos]];
                                        }
                                        // si vingt à 60 ou 80, et 1, mettre x et 1
                                        if (((($milnum[$pre]>=2)&&($milnum[$pre]<=6))||($milnum[$pre]==8))&&($milnum[$pos]==1)){
                                                $res.="et-".$tabchiffres[$milnum[$pos]];
                                        }
                                        // si vingt à 60 ou 80 et pas 1
                                        if (((($milnum[$pre]>=2)&&($milnum[$pre]<=6))||($milnum[$pre]==8))&&($milnum[$pos]!=1)){
                                                $res.=$tabchiffres[$milnum[$pos]];
                                        }
                                }
                        }
                }
                // si total>1, mettre le tabpuiss[puiss]
                if (($milnum>=1)&&($tabpuis[$puiss]!="")){
                        $res.=($res!="")?" ":"";
                        $res.=$tabpuis[$puiss]; // mille est invariable
                        // mais million, non
                        $res.=(($puiss==3)&&($milnum>1))?"s":"";
                }
                $puiss--;
        }
        if ($num==0){
                $res="zéro";       
        }
        return $res;
}

Répondre à cet article

Total 147329 visites depuis 2477 jours | Site réalisé par Vader[FR] | SPIP | | Plan du site | Suivre la vie du site RSS 2.0 | contact mail