Montant en toutes lettres [maj]

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 659 fois - Téléchargée 32 fois


Contenu du snippet

Cette fonction permet de convertir un montant en chiffre (251,01) en lettre (deux cent cinquante et un euros et un cents).
La source n'est pas parfaite, je l'ai juste réalisé pour une application professionnelle spécifique à mes besoins.
Fonctionne pour un chiffre de décimale de type ######.## ou ######,##

Source / Exemple :


<?php
function cvnbst($nombre){
    $nb1 = Array('un','deux','trois','quatre','cinq','six','sept','huit','neuf','dix','onze','douze','treize','quatorze','quinze','seize','dix-sept','dix-huit','dix-neuf');

    $nb2 = Array('vingt','trente','quarante','cinquante','soixante','soixante','quatre-vingt','quatre-vingt');
    
    # Décomposition du chiffre
    # Séparation du nombre entier et des décimales
    if (preg_match("/\b,\b/i", $nombre)){
        $nombre = explode(',',$nombre);
    }else{
        $nombre = explode('.',$nombre);
    }
    $nmb = $nombre[0];
    
    # Décomposition du nombre entier par tranche de 3 nombre (centaine, dizaine, unitaire)
    $i=0;
    while(strlen($nmb)>0){
        $nbtmp[$i]=substr($nmb,-3);
        if( strlen($nmb)>3  ){
            $nmb=substr($nmb,0,strlen($nmb)-3);
        }else{
            $nmb='';
        }
        $i++;
    }
    $nblet='';
    ## Taitement du côté entier
    for($i=1;$i>=0;$i--){
        if(strlen(trim($nbtmp[$i]))==3){
            $ntmp=substr($nbtmp[$i],1);

            if(substr($nbtmp[$i],0,1)<>1 && substr($nbtmp[$i],0,1)<>0){
                $nblet.=$nb1[substr($nbtmp[$i],0,1)-1];
                if( $ntmp<>0 ){
                    $nblet.=' cent ';
                }else{
                    $nblet.=' cents ';
                }
            }elseif( substr($nbtmp[$i],0,1)<>0 ){
                $nblet.='cent ';
            }
            
        }else{
          $ntmp=$nbtmp[$i];
        }

        if($ntmp>0 && $ntmp<20){
            if( !($i==1 && $nbtmp[$i]==1) ){
                $nblet.=$nb1[$ntmp-1].' ';
            }
        }

        if($ntmp>=20 && $ntmp<60){
            switch(substr($ntmp,1,1)){
                case 1 :    $sep=' et ';
                            break;
                case 0 :    $sep='';
                            break;
                default:    $sep='-';
            }
            $nblet.=$nb2[substr($ntmp,0,1)-2].$sep.$nb1[substr($ntmp,1,1)-1].' ';
        }

        if($ntmp>=60 && $ntmp<80){
            $nblet.=$nb2[4];
            switch(substr($ntmp,1,1)){
                case 1 :    $sep=' et ';
                            break;
                case 0 :    $sep='';
                            break;
                default:    $sep='-';
            }

                if(substr($ntmp,0,1)<>7){
                    $nblet.=$sep.$nb1[substr($ntmp,1,1)-1].' ';
                }else{
                    if(substr($ntmp,1,1)+9==9)$sep='-';
                    $nblet.=$sep.$nb1[substr($ntmp,1,1)+9].' ';
                }
            
        }

        if($ntmp>=80 && $ntmp<100){
            $nblet.=$nb2[6];
            switch(substr($ntmp,1,1)){
                case 1 :    $sep=' et ';
                            break;
                case 0 :    $sep='';
                            break;
                default:    $sep='-';
            }
            
            //if(substr($ntmp,1,1)<>0){
                if(substr($ntmp,0,1)<>9){
                    $nblet.=$sep.$nb1[substr($ntmp,1,1)-1];
                    if(substr($ntmp,1,1)==0)$nblet.='s';
                }else{
                    if(substr($ntmp,1,1)==0)$sep='-';
                    $nblet.=$sep.$nb1[substr($ntmp,1,1)+9];
                }
            $nblet.=' ';
            //}elseif(substr($ntmp,0,1)<>9){
            //    $nblet.='s ';
            //}else{
            //    $nblet.=' ';
            //}
        }
        
        if($i==1 && $nbtmp[$i]<>0){
            if($nbtmp[$i]>1){
              $nblet.='milles ';
            }else{
              $nblet.='mille ';
            }
        }

    }

    if( $nombre[0]>1 )$nblet.='euros ';
    if( $nombre[0]==1 )$nblet.='euro ';

    ## Traitement du côté décimale
    if( $nombre[0]>0 && $nombre[1]>0 )$nblet.=' et ';
    $ntmp=substr($nombre[1],0,2);
    if( !empty($ntmp) ){
        if($ntmp>0 && $ntmp<20){
            $nblet.=$nb1[$ntmp-1].' ';
        }

        if($ntmp>=20 && $ntmp<60){
            switch(substr($ntmp,1,1)){
                case 1 :    $sep=' et ';
                            break;
                case 0 :    $sep='';
                            break;
                default:    $sep='-';
            }
            $nblet.=$nb2[substr($ntmp,0,1)-2].$sep.$nb1[substr($ntmp,1,1)-1].' ';
        }

        if($ntmp>=60 && $ntmp<80){
            $nblet.=$nb2[4];
            switch(substr($ntmp,1,1)){
                case 1 :    $sep=' et ';
                            break;
                case 0 :    $sep='';
                            break;
                default:    $sep='-';
            }

                if(substr($ntmp,0,1)<>7){
                    $nblet.=$sep.$nb1[substr($ntmp,1,1)-1].' ';
                }else{
                    if(substr($ntmp,1,1)+9==9)$sep='-';
                    $nblet.=$sep.$nb1[substr($ntmp,1,1)+9].' ';
                }
                
        }

        if($ntmp>=80 && $ntmp<100){
            $nblet.=$nb2[6];
            switch(substr($ntmp,1,1)){
                case 0 :    $sep='';
                            break;
                default:    $sep='-';
            }

                if(substr($ntmp,0,1)<>9){
                    $nblet.=$sep.$nb1[substr($ntmp,1,1)-1];
                    if(substr($ntmp,1,1)==0)$nblet.='s';
                }else{
                    if(substr($ntmp,1,1)==0)$sep='-';
                    $nblet.=$sep.$nb1[substr($ntmp,1,1)+9];
                }
            $nblet.=' ';

        }

        if($ntmp<>0 && !empty($ntmp) ){
            if($ntmp>1){
                $nblet.='cents ';
            }else{
                $nblet.='cent ';
            }
        }
    }
        
return $nblet;

}
echo '189.11 : '.cvnbst(189.11).'<br>';
echo '542.78 : '.cvnbst(542.78).'<br>';
echo '280 : '.cvnbst(280).'<br>';

?>

A voir également

Ajouter un commentaire

Commentaires

ludo7910
Messages postés
5
Date d'inscription
vendredi 7 mars 2003
Statut
Membre
Dernière intervention
25 août 2005

script très pratique.

il y a juste une petite erreur, mille est invariable (deux mille et pas deux milles)

http://fr.wikipedia.org/wiki/Adjectif_num%C3%A9ral
fuckya
Messages postés
125
Date d'inscription
mercredi 31 mars 2004
Statut
Membre
Dernière intervention
8 juin 2006

Ah si en fait ca s'affiche bien a partir de 100 mais après il y'a quelques bugs
fuckya
Messages postés
125
Date d'inscription
mercredi 31 mars 2004
Statut
Membre
Dernière intervention
8 juin 2006

J'ai essayé de voir tous les résultats avec ce code :

for($i=0;$i<1000;$i++) {
for($k=0;$k<100;$k++) {
$point = '.';
if($k<10) $j = 0;
if($j 0 && $k 0) {
$j = '';
$k = '';
$point = '';
}
echo $i, $point;
echo $j, $k;
echo ' : ', cvnbst($i.''.$point.''.$j.''.$k), '
';
$j = '';
}
}

Le seul truc c'est que le chiffre avant euros s'affiche pas, bien que les centimes le soient
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
http://www.euro.gouv.fr/zoomentre/index3.htm
Page officielle du gouvernement avec le sigle de la ripoublique où vous verrez en titre 'euros' avec S.

Les billets n'en mettent pas car il doit y avoir harmonisation pour les différents pays, toutes les langues n'ayant pas le 'S' comme marque du pluriel, on est donc allé au plus petit dénominateur commun.
Pour autant on met un 'S' dans un texte français qui parle des euros.
fuckya
Messages postés
125
Date d'inscription
mercredi 31 mars 2004
Statut
Membre
Dernière intervention
8 juin 2006

$nb2 = array('vingt','trente','quarante','cinquante','soixante','soixante','quatre-vingt'

dans cette ligne il y'a deux fois soixante, c'est normal ? je sais pas si ca bug dans le script a la sortie

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.