IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[Code] Avis ?


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 75
    Points : 54
    Points
    54
    Par défaut [Code] Avis ?
    Hello le monde , en laissant mon imagination de debutant reflechir je me suis amusez a ca j aimerai bien un avis ... y a t il un module qui permet de faire ca ? Auriez vous fait differement ... merci de votre attention
    but : convertir une chaine numerique en son equivalent en chaine de caractere exemple "91" -= > "quatre vingt onze" pour le moment le script prend de 0 a 999 ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    #!/usr/bin/perl
     %mot = (
     '0'                    =>              ' zero',
    '1'                     =>              ' et un',
    '2'                     =>              ' deux',
    '3'                     =>              ' trois',
    '4'                     =>              ' quatre',
    '5'                     =>              ' cinq',
    '6'                     =>              ' six',
    '7'                     =>              ' sept',
    '8'                     =>              ' huit',
    '9'                     =>              ' neuf',
    '10'                    =>             ' dix',
    '11'                    =>	          ' onze',
    '12'	         =>             ' douze',
    '13'	         =>             ' treize',
    '14'	         =>	          ' quatorze',
    '15'	         =>	          ' quinze',
    '16'	         =>	           ' seize',
    '17'                    =>             ' dix sept' ,
    '18'                    =>             ' dix huit' ,
    '19'                    =>             ' dix neuf' ,
    '20'	        	=>		' vingt',
    '30'	        	=>		' trente',
    '40'	        	=>		' quarante',
    '50'	        	=>		' cinquante',
    '70'	        	=>		' soixante dix',
    '71'	        	=>		' soixante et onze',
    '60'	        	=>		' soixante',
    '80'	        	=>		' quatre-vingt',
    '81'	        	=>		' quatre-vingt un',
    '90'	        	=>		' quatre vingt-dix',
    'cent'	        	=>		' cent',
    '100'	        	=>		' cents',
    '1000'	        	=>		' mille',
    '1000a'	        	=>		' milles',
    '1000000'	      	=>		' million',
    '1000000a'	      	=>		' millions',
    '1000000000'	=>		' milliard',
    '1000000000a'	=>		' milliards',
    );
     
    $cpt = 0 ;
    do
    {
    print "Saisir un nombre\n:>" ;
    chomp  ( $g = <STDIN> ) ;
    $greg = &convertir_chiffre ($g) ;
    print "$greg \n" ;
    }
    until ( $cpt == 1 ) ;
    #################################
    sub convertir_chiffre
    {
      my ($convertir_nombre ) = @_ ;
    $longueur_nombre = length $convertir_nombre ;
    my $nombre_final ;
    my $chiffre1 = substr ( $convertir_nombre ,0,1) ;
    my $chiffre2 = substr ( $convertir_nombre ,1,1) ;
    my $chiffre3 = substr ( $convertir_nombre ,2,1) ;
    my $chiffre4 = substr ( $convertir_nombre ,3,1) ;
    my $chiffre5 = substr ( $convertir_nombre ,4,1) ;
      if    ( $convertir_nombre < 100  )               {$nombre_final = &inferieur_100 ( $convertir_nombre ) ;}
      elsif ( $convertir_nombre == 100 )             { $nombre_final = " cent";}
      elsif ( $convertir_nombre == 101 )                                                            { $nombre_final = " cent un";}
      elsif ( $longueur_nombre < 4 && $chiffre2 == 0 && $chiffre3 ==0 )  { $nombre_final = $mot{$chiffre1} .$mot{100} ; }
      elsif ( $longueur_nombre < 4 && $chiffre2 == 0 && $chiffre3 ==1 )  { $nombre_final = $mot{$chiffre1} . $mot{100} . " et un"; }
      elsif ( $longueur_nombre < 4 && $chiffre1 == 1 ) {$number = $chiffre2.$chiffre3 ;$nombre_final = $mot{cent}. &inferieur_100 ( $number ) ;   }
      elsif ( $longueur_nombre < 4 ) {$number = $chiffre2.$chiffre3 ;$nombre_final = $mot{$chiffre1} .$mot{100}. &inferieur_100 ( $number ) ;   }
      $nombre_lettre_netoyer = &netoyer_espace ($nombre_final) ;
      return $nombre_lettre_netoyer
    }
    #####traite les chiffres inferieure a 100
    sub inferieur_100
    {
     my ( $nombre_inferieur_100 ) = @_ ;
     my $chiffre_1 = substr ( $nombre_inferieur_100 ,0,1) ;
     my $chiffre_2 = substr ( $nombre_inferieur_100 ,1,1) ;
     $longueurnombre = length $nombre_inferieur_100 ;
      if ( $nombre_inferieur_100 == 1 ) { $nombrefinal = " un" ; }
      elsif ($nombre_inferieur_100 < 21  || $nombre_inferieur_100 == 71 ) { $nombrefinal = $mot{$nombre_inferieur_100}}
      elsif (  $chiffre_2 == 0 && $longueurnombre == 2 ) { $nombrefinal = $mot{$chiffre_1 * 10} ;}
      else
                 {
                      if ( $chiffre_1 == 2 || $chiffre_1 == 3 || $chiffre_1 == 4 || $chiffre_1 == 5 || $chiffre_1 == 6 || $chiffre_1 == 8)
                          {
                                    $nombrefinal = $mot{$chiffre_1 * 10} . $mot{$chiffre_2}
                          }
                      elsif ( $chiffre_1 == 7 || $chiffre_1 == 9 )
                          {
                           $num = $chiffre_1 -1 ;
                           $nombrefinal = $mot{$num * 10} . $mot{$chiffre_2+10} ;
                          }
                 }
      return $nombrefinal
     }
    ################################
    sub netoyer_espace
    {
      my ( $nombre_f ) = @_ ;
      my $longueur_n = length $nombre_f ;
      $espace = substr ( $nombre_f , 0 , 1 ) ;
      if ( $espace eq " " ) {$nombre_f=substr ( $nombre_f , 1 , $longueur_n ) ;}
    }

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    C'est pas mal, peut être que cela mériterait une meilleure présentation du code et des commentaires en plus.
    Une fois optimisé, tu pourras toujours le poster dans notre rubrique Snippets: http://www.developpez.net/forums/vie....php?t=262086.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  3. #3
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Ou alors, il faut en faire un concours

    J'ai ce code-ci sous la main depuis plusieurs mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #!/usr/bin/perl
     
    use warnings;
    use strict;
     
    my %unites = (0, '', 1, 'un', 2, 'deux', 3, 'trois', 4, 'quatre',
                  5, 'cinq', 6, 'six', 7, 'sept', 8, 'huit', 9, 'neuf',
                  10, 'dix', 11, 'onze', 12, 'douze', 13, 'treize', 14, 'quatorze',
                  15, 'quinze', 16, 'seize', 17, 'dix-sept', 18, 'dix-huit', 19, 'dix-neuf');
     
    my %dizaines = (0, '', 1, 'dix', 2, 'vingt', 3, 'trente', 4, 'quarante',
                    5, 'cinquante', 6, 'soixante', 7, 'soixante', 8, 'quatre-vingt', 9, 'quatre-vingt');
     
    my %groupes = (0, '', 1, 'mille', 2, 'million', 3, 'milliard', 4, 'billion');
    my $groupe=0;
     
    my $nombre;
     
    $nombre="1501011161321";
    print "$nombre\n";
     
    my @mots = ();
     
    my $local = $nombre;
    1 while ($local =~ s/(\S)(\d{3})(\s|$)/$1 $2$3/);
     
    my @paquets=split(/ /,$local);
    # @paquets=reverse(@paquets);
     
    my $i = @paquets-1;
     
    foreach my $paquet (@paquets) {
      my $orig_paquet = $paquet;
     
      my ($centaine, $dizaine, $unite) = ($paquet =~ m/(\d)?(\d)?(\d)/);
      $paquet = '';
     
      $paquet .= $unites{$centaine} if (defined $centaine and ($centaine != 1));
      $paquet .= ' cent' if (defined $centaine and ($centaine > 1));
      $paquet .= 's' if (defined $centaine and ($centaine > 1) and ($dizaine == 0) and ($unite == 0));
      $paquet .= 'cent' if (defined $centaine and ($centaine == 1));
      $paquet .= ' ' if (defined $centaine and ($centaine != 0));
     
      $paquet .= "$dizaines{$dizaine}" if (defined $dizaine and ($dizaine != 1));
      $paquet .= ' ' if (defined $dizaine and ($dizaine != 0));
      $dizaine = 1 if (defined $dizaine and (($dizaine == 7) or ($dizaine == 9)));
      if (defined $dizaine and ($dizaine == 1)) {
        $paquet .= $unites{$dizaine.$unite};
        $unite=0;
      }
     
      $paquet .= $unites{$unite};
      $paquet =~ s/(nte|ngt) (\w)/$1-$2/;
      $paquet =~ s/(nte)-(un|onze)/$1 et $2/;
      $paquet =~ s/(vingt)-(un)/$1 et $2/;
     
      $paquet = "" if (($i == 1) and ($orig_paquet == 1));
      push (@mots, $paquet);
      push (@mots, " $groupes{$i}");
      $mots[-1] .= "s" if (($orig_paquet > 1) and ($i > 1));
      $mots[-1] .= " ";
      $i--;
    }
     
    print @mots;
    print "\n";
    Il reste un double-espace qui traine, mais les traits d'unions et les pluriels nécessaires sont correctement gérés au vu de ce qui est dit ici.

    Pour ce qui est des commentaires, j'hésite encore à en mettre
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 75
    Points : 54
    Points
    54
    Par défaut
    As tu geré 71 ? parce que on dit pas soixante onze mais soixante ET onze
    c comme 101 cent un et pas cent et un ... moi j ai refais mon bout de code apres reflection a ceci

  5. #5
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par needles94000
    As tu geré 71 ? parce que on dit pas soixante onze mais soixante ET onze
    c comme 101 cent un et pas cent et un ... moi j ai refais mon bout de code apres reflection a ceci
    Oui ... tout ça est géré 8)

    Pour s'en convaincre, il suffit de faire un $nombre="101071"; au début du code.

    Il affiche alors bien "cent un mille soixante et onze".

    Le GROS bug de mon code, c'est qu'il ne prend pas en compte les zéros initiaux : on le prend en défaut avec un "0000001", mais c'est très facile à corriger (hmmm ... un petit s/^0+([1-9])/$1/ peut-être).

    Le petit bug de mon code, c'est que pour certaines valeurs, il peut trainer un double espace entre deux mots, voire un espace terminal. C'est aussi très facile à corriger.


    Maintenant, j'aurais à le refaire, je partirais sur une conception encore différente ... tant il existe de façons de le faire.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

Discussions similaires

  1. Quel est votre avis sur Code::Blocks ?
    Par doudoustephane dans le forum Code::Blocks
    Réponses: 54
    Dernier message: 12/06/2009, 11h58
  2. Réponses: 4
    Dernier message: 26/04/2006, 14h36
  3. [Code Prof]votre avis sur un code?
    Par granquet dans le forum Réseau
    Réponses: 6
    Dernier message: 11/04/2006, 20h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo