FORUM Tom's Hardware » Programmation » C / C++ / Java » convertir un nombre en lettre
 

convertir un nombre en lettre

Il y a 256 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici



Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : convertir un nombre en lettre
 
jene sais pas je demande, merci de vos suggestion
Plus d'informations

bonjour
je développe un programme en C qui contient différentes fonctions. Parmi ces dernières, j'ai une fonction qui doit convertir un nombre saisi au clavier en lettre. Merci de votre aide

C is a sharp tool
Plus d'informations

a écrit :

bonjour
je développe un programme en C qui contient différentes fonctions. Parmi ces dernières, j'ai une fonction qui doit convertir un nombre saisi au clavier en lettre. Merci de votre aide


Tu veux dire en mot ?

1 -> "un" etc. ?
11 -> "onze" etc. ?

sinon, soit plus précis.

NOTA : supprimme le deuxième sujet et modifie celui-là si besoin est...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 20-02-2006 à 12:14:26

---------------
Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://mapage.noos.fr/emdel/

 

jene sais pas je demande, merci de vos suggestion
Plus d'informations

a écrit :

Tu veux dire en mot ?

1 -> "un" etc. ?
11 -> "onze" etc. ?

sinon, soit plus précis.

NOTA : supprimme le deuxième sujet et modifie celui-là si besoin est...


c un nombre (150.45 par exemple) que je voudrais convertir.

C is a sharp tool
Plus d'informations

a écrit :

c un nombre (150.45 par exemple) que je voudrais convertir.


Je ne comprends pas ce que tu veux faire. Peux-tu montrer un exemple avant/après ?


---------------
Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://mapage.noos.fr/emdel/

 

jene sais pas je demande, merci de vos suggestion
Plus d'informations

a écrit :

Je ne comprends pas ce que tu veux faire. Peux-tu montrer un exemple avant/après ?


je n'ai pas encore d'exemple car mon programme est en phase de développement. seulement voici ce que je voudrais faire: une fonction qui doit convertir en lettre un nombre saisi au clavier.

C is a sharp tool
Plus d'informations

a écrit :

je n'ai pas encore d'exemple car mon programme est en phase de développement. seulement voici ce que je voudrais faire: une fonction qui doit convertir en lettre un nombre saisi au clavier.



Ok. Je reprends. Je voudrais que tu me donne un exemple du résultat attendu. Si je tapes 123, ça doit donner quoi ?

Par ce que 'convertir en lettre', c'est peut être évident pour toi, mais pour moi, ça n'a aucun sens. Je t'ai déjà demandé si ça voulais dire

1 donne "un"
ou
11 donne "onze
ou
12.34 donne "douze virgule trente-quatre"

mais tu ne m'as pas répondu. J'en conclue que ce n'est pas ça. Alors c'est quoi ?

Si tu ne sais pas expliquer ce que tu veux faire, on ne peut pas t'aider.


---------------
Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://mapage.noos.fr/emdel/

 

jene sais pas je demande, merci de vos suggestion
Plus d'informations

a écrit :

Ok. Je reprends. Je voudrais que tu me donne un exemple du résultat attendu. Si je tapes 123, ça doit donner quoi ?

Par ce que 'convertir en lettre', c'est peut être évident pour toi, mais pour moi, ça n'a aucun sens. Je t'ai déjà demandé si ça voulais dire

1 donne "un"
ou
11 donne "onze
ou
12.34 donne "douze virgule trente-quatre"

mais tu ne m'as pas répondu. J'en conclue que ce n'est pas ça. Alors c'est quoi ?

Si tu ne sais pas expliquer ce que tu veux faire, on ne peut pas t'aider.



voici ce que j'attends à ma fonction: 12.34 donne "douze virgule trente-quatre"

C is a sharp tool
Plus d'informations

a écrit :

voici ce que j'attends à ma fonction: 12.34 donne "douze virgule trente-quatre"


Ok. C'est donc bien une conversion de nombre en texte.

En fait l'expression courante semble être "convertir un nombre en toutes lettres"

C'est une fonction assez complexe, car elle met en jeux des regles de grammaire et de syntaxe qui, de plus, ont des variantes internationales (on ne prononce pas 70 de la même façon en France et en Belgique...)

Ensuite, il faut déterminer les nombreux cas particuliers... C'est assez cauchemardesque.

La théorie :

http://www.graner.net/nicolas/nombres/nom-exp.php

Il existe probablement des réalisations sur le net. :google: est ton ami...

Exemples en Visual BASIC :
http://www.vbfrance.com/code.aspx?ID=25880
http://access.jessy.free.fr/htm/Nu [...] ettres.htm

En C# (on s'approche !)
http://michael.carbenay.info/conve [...] ost-25.htm

Enfin, un petit essai que je viens de coder en m'aidant de ma bibliothèque personnelle (mais publique).

http://mapage.noos.fr/emdel/clib.htm

(oui, désolé, mais j'ai passé l'âge de gérer les chaines 'à-la-main'. La machine fait ça beaucoup mieux que moi si on lui demande gentiment...)

Fonctionne pour 0 à 100. C'est déjà pas trivial... Tu te sens de taille à faire les nombre décimaux ?

EDIT : quelques corrections (quatre-vingts, quatre-vingt onze)

Code :
  1. #include "ed/inc/fstr.h"
  2. #include "ed/inc/sys.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. static char *num2text_dyn(int n)
  6. {
  7.   char *s = NULL;
  8.   fstr_s *fs = fstr_create(8);
  9.   if (fs)
  10.   {
  11.       static char const *as_0_19[] =
  12.         {
  13.             "zero",
  14.             "un",
  15.             "deux",
  16.             "trois",
  17.             "quatre",
  18.             "cinq",
  19.             "six",
  20.             "sept",
  21.             "huit",
  22.             "neuf",
  23.             "dix",
  24.             "onze",
  25.             "douze",
  26.             "treize",
  27.             "quatorze",
  28.             "quinze",
  29.             "seize",
  30.             "dix-sept",
  31.             "dix-huit",
  32.             "dix-neuf",
  33.         };
  34.       static char const *as_dizaines[] =
  35.         {
  36.             "???",
  37.             "???",
  38.             "vingt",
  39.             "trente",
  40.             "quarante",
  41.             "cinquante",
  42.             "soixante",
  43.             "soixante",
  44.             "quatre-vingt",
  45.             "quatre-vingt",
  46.         };
  47.       if (n >= 0 && n <= 19)
  48.       {
  49.         fstr_cat (fs, as_0_19[n]);
  50.       }
  51.       else if (n >= 20 && n <= 59)
  52.       {
  53.         int d = n / 10;
  54.         int u = n % 10;
  55.         fstr_cat (fs, as_dizaines[d]);
  56.         if (u != 0)
  57.         {
  58.             if (u == 1)
  59.             {
  60.               fstr_cat (fs, " et " );
  61.             }
  62.             else
  63.             {
  64.               fstr_cat (fs, " " );
  65.             }
  66.             fstr_cat (fs, as_0_19[u]);
  67.         }
  68.       }
  69.       /* France */
  70.       else if (n >= 60 && n <= 79)
  71.       {
  72.         int d = n / 10;
  73.         int u = n % 20;
  74.         fstr_cat (fs, as_dizaines[d]);
  75.         if (u != 0)
  76.         {
  77.             switch (u)
  78.             {
  79.             case 1:
  80.             case 11:
  81.               fstr_cat (fs, " et " );
  82.               break;
  83.             case 17:
  84.             case 18:
  85.             case 19:
  86.               fstr_cat (fs, "-" );
  87.               break;
  88.             default:
  89.               fstr_cat (fs, " " );
  90.             }
  91.             fstr_cat (fs, as_0_19[u]);
  92.         }
  93.       }
  94.       /* France */
  95.       else if (n >= 80 && n <= 99)
  96.       {
  97.         int d = n / 10;
  98.         int u = n % 20;
  99.         fstr_cat (fs, as_dizaines[d]);
  100.         if (u == 0)
  101.         {
  102.               fstr_cat (fs, "s" );
  103.         }
  104.         else
  105.         {
  106.             switch (u)
  107.             {
  108.             case 17:
  109.             case 18:
  110.             case 19:
  111.               fstr_cat (fs, "-" );
  112.               break;
  113.             default:
  114.               fstr_cat (fs, " " );
  115.             }
  116.             fstr_cat (fs, as_0_19[u]);
  117.         }
  118.       }
  119.       else
  120.       {
  121.       }
  122.       s = fstr_remove (fs);
  123.       fstr_delete (fs), fs = NULL;
  124.   }
  125.   ASSERT(fs == NULL);
  126.   return s;
  127. }
  128. int main (void)
  129. {
  130.   int B = 60;
  131.   int N = 40;
  132.   int i;
  133.   for (i = B; i < B + N; i++)
  134.   {
  135.       char *s = num2text_dyn(i);
  136.       if (s != NULL)
  137.       {
  138.         printf ("%d = '%s'\n", i, s);
  139.         free (s), s = NULL;
  140.       }
  141.   }
  142.   return 0;
  143. }


La partie rigolote étant celle-ci (du moins en français, c'est moins drôle en belge) :
(CORRIGEE)


60 = 'soixante'
61 = 'soixante et un'
62 = 'soixante deux'
63 = 'soixante trois'
64 = 'soixante quatre'
65 = 'soixante cinq'
66 = 'soixante six'
67 = 'soixante sept'
68 = 'soixante huit'
69 = 'soixante neuf'
70 = 'soixante dix'
71 = 'soixante et onze'
72 = 'soixante douze'
73 = 'soixante treize'
74 = 'soixante quatorze'
75 = 'soixante quinze'
76 = 'soixante seize'
77 = 'soixante-dix-sept'
78 = 'soixante-dix-huit'
79 = 'soixante-dix-neuf'
80 = 'quatre-vingts'
81 = 'quatre-vingt un'
82 = 'quatre-vingt deux'
83 = 'quatre-vingt trois'
84 = 'quatre-vingt quatre'
85 = 'quatre-vingt cinq'
86 = 'quatre-vingt six'
87 = 'quatre-vingt sept'
88 = 'quatre-vingt huit'
89 = 'quatre-vingt neuf'
90 = 'quatre-vingt dix'
91 = 'quatre-vingt onze'
92 = 'quatre-vingt douze'
93 = 'quatre-vingt treize'
94 = 'quatre-vingt quatorze'
95 = 'quatre-vingt quinze'
96 = 'quatre-vingt seize'
97 = 'quatre-vingt-dix-sept'
98 = 'quatre-vingt-dix-huit'
99 = 'quatre-vingt-dix-neuf'

Message cité 1 fois
Message édité par Emmanuel Delahaye le 27-02-2007 à 09:47:03

---------------
Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://mapage.noos.fr/emdel/

 

zeb
Profil : Modérateur libre

RTFM --> pour une fois le F*** manual c'est le bescherelle. :D :D :D


Message édité par zeb le 20-02-2006 à 15:30:19
jene sais pas je demande, merci de vos suggestion
Plus d'informations

a écrit :

Ok. C'est donc bien une conversion de nombre en texte.

En fait l'expression courante semble être "convertir un nombre en toutes lettres"

C'est une fonction assez complexe, car elle met en jeux des regles de grammaire et de syntaxe qui, de plus, ont des variantes internationales (on ne prononce pas 70 de la même façon en France et en Belgique...)

Ensuite, il faut déterminer les nombreux cas particuliers... C'est assez cauchemardesque.

La théorie :

http://www.graner.net/nicolas/nombres/nom-exp.php

Il existe probablement des réalisations sur le net. :google: est ton ami...

Exemples en Visual BASIC :
http://www.vbfrance.com/code.aspx?ID=25880
http://access.jessy.free.fr/htm/Nu [...] ettres.htm

En C# (on s'approche !)
http://michael.carbenay.info/conve [...] ost-25.htm

Enfin, un petit essai que je vens de coder en m'aidant de ma bibliothèque personnelle (mais publique).

http://mapage.noos.fr/emdel/clib.htm

(oui, désolé, mais j'ai passé l'âge de gérer les chaines 'à-la-main'. La machine fait ça beaucoup mieux que moi si on lui demande gentiment...)

Fonctionne pour 0 à 100. C'est déjà pas trivial... Tu te sens de taille à faire les nombre décimaux ?

Code :
  1. #include "ed/inc/fstr.h"
  2. #include "ed/inc/sys.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. static char *num2text_dyn(int n)
  6. {
  7.   char *s = NULL;
  8.   fstr_s *fs = fstr_create(8);
  9.   if (fs)
  10.   {
  11.       static char const *as_0_19[] =
  12.         {
  13.             "zero",
  14.             "un",
  15.             "deux",
  16.             "trois",
  17.             "quatre",
  18.             "cinq",
  19.             "six",
  20.             "sept",
  21.             "huit",
  22.             "neuf",
  23.             "dix",
  24.             "onze",
  25.             "douze",
  26.             "treize",
  27.             "quatorze",
  28.             "quinze",
  29.             "seize",
  30.             "dix-sept",
  31.             "dix-huit",
  32.             "dix-neuf",
  33.         };
  34.       static char const *as_dizaines[] =
  35.         {
  36.             "???",
  37.             "???",
  38.             "vingt",
  39.             "trente",
  40.             "quarante",
  41.             "cinquante",
  42.             "soixante",
  43.             "soixante",
  44.             "quatre-vingt",
  45.             "quatre-vingt",
  46.         };
  47.       if (n >= 0 && n <= 19)
  48.       {
  49.         fstr_cat (fs, as_0_19[n]);
  50.       }
  51.       else if (n >= 20 && n <= 59)
  52.       {
  53.         int d = n / 10;
  54.         int u = n % 10;
  55.         fstr_cat (fs, as_dizaines[d]);
  56.         if (u != 0)
  57.         {
  58.             if (u == 1)
  59.             {
  60.               fstr_cat (fs, " et " );
  61.             }
  62.             else
  63.             {
  64.               fstr_cat (fs, " " );
  65.             }
  66.             fstr_cat (fs, as_0_19[u]);
  67.         }
  68.       }
  69.       /* France */
  70.       else if (n >= 60 && n <= 99)
  71.       {
  72.         int d = n / 10;
  73.         int u = n % 20;
  74.         fstr_cat (fs, as_dizaines[d]);
  75.         if (u != 0)
  76.         {
  77.             switch (u)
  78.             {
  79.             case 1:
  80.             case 11:
  81.               fstr_cat (fs, " et " );
  82.               break;
  83.             case 17:
  84.             case 18:
  85.             case 19:
  86.               fstr_cat (fs, "-" );
  87.               break;
  88.             default:
  89.               fstr_cat (fs, " " );
  90.             }
  91.             fstr_cat (fs, as_0_19[u]);
  92.         }
  93.       }
  94.       else
  95.       {
  96.       }
  97.       s = fstr_remove (fs);
  98.       fstr_delete (fs), fs = NULL;
  99.   }
  100.   ASSERT(fs == NULL);
  101.   return s;
  102. }
  103. int main (void)
  104. {
  105.   int B = 60;
  106.   int N = 40;
  107.   int i;
  108.   for (i = B; i < B + N; i++)
  109.   {
  110.       char *s = num2text_dyn(i);
  111.       if (s != NULL)
  112.       {
  113.         printf ("%d = '%s'\n", i, s);
  114.         free (s), s = NULL;
  115.       }
  116.   }
  117.   return 0;
  118. }


La partie rigolote étant celle-ci (du moins en français, c'est moins drôle en belge) :


60 = 'soixante'
61 = 'soixante et un'
62 = 'soixante deux'
63 = 'soixante trois'
64 = 'soixante quatre'
65 = 'soixante cinq'
66 = 'soixante six'
67 = 'soixante sept'
68 = 'soixante huit'
69 = 'soixante neuf'
70 = 'soixante dix'
71 = 'soixante et onze'
72 = 'soixante douze'
73 = 'soixante treize'
74 = 'soixante quatorze'
75 = 'soixante quinze'
76 = 'soixante seize'
77 = 'soixante-dix-sept'
78 = 'soixante-dix-huit'
79 = 'soixante-dix-neuf'
80 = 'quatre-vingt'
81 = 'quatre-vingt et un'
82 = 'quatre-vingt deux'
83 = 'quatre-vingt trois'
84 = 'quatre-vingt quatre'
85 = 'quatre-vingt cinq'
86 = 'quatre-vingt six'
87 = 'quatre-vingt sept'
88 = 'quatre-vingt huit'
89 = 'quatre-vingt neuf'
90 = 'quatre-vingt dix'
91 = 'quatre-vingt et onze'
92 = 'quatre-vingt douze'
93 = 'quatre-vingt treize'
94 = 'quatre-vingt quatorze'
95 = 'quatre-vingt quinze'
96 = 'quatre-vingt seize'
97 = 'quatre-vingt-dix-sept'
98 = 'quatre-vingt-dix-huit'
99 = 'quatre-vingt-dix-neuf'





merci a tous. mais c laborieux à réaliser comme programme comme tu le dis

zeb
Profil : Modérateur libre

RTFM :o

J'insiste, mais ne recopie pas l'exemple tel que, c'est plein de fotes de fransè (et/ou belge). Les traits d'union et les pluriels sont une vraie misère !

Et n'oubliont pas les suisses chez qui 80 peut se dire octante :D

C is a sharp tool
Plus d'informations

a écrit :

J'insiste, mais ne recopie pas l'exemple tel que, c'est plein de fotes de fransè (et/ou belge). Les traits d'union et les pluriels sont une vraie misère !

Et n'oubliont pas les suisses chez qui 80 peut se dire octante :D


Ok, y'a pas de 's' à 'quatre-vingt'. A part ça ?

http://www.graner.net/nicolas/nombres/nom.php


Message édité par Emmanuel Delahaye le 21-02-2006 à 11:34:04

---------------
Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://mapage.noos.fr/emdel/