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

Transformer un nombre (entier naturel) en sa description textuelle

dimanche 1er juillet 2018

Enregistrer au format PDF Format PDF | 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 259392 visites depuis 3511 jours | Site réalisé par Vader[FR] | SPIP | | Plan du site | Suivre la vie du site RSS 2.0 | contact mail