Se connecter avec
S'enregistrer | Connectez-vous

convertir un nombre en lettre

Dernière réponse : dans Programmation
Lassé par la pub ? Créez un compte

flock a dit :
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...

la trotte a dit :
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.

la trotte a dit :
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.

flock a dit :
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.

la trotte a dit :
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"

flock a dit :
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/Number/ConvertNbLettres...

En C# (on s'approche !)
http://michael.carbenay.info/conversion-nombres-lettres...

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

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'

la trotte a dit :
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/Number/ConvertNbLettres...

En C# (on s'approche !)
http://michael.carbenay.info/conversion-nombres-lettres...

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

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
Expert Programmation

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 
Expert Programmation

Oui, un s à quatre-vingt, qui est invariable, pas de et après quatre-vingts, des traits d'union entre tous les mots en dessous de 100.

EDIT:

Emmanuel>> je me relis et je me rends compte que la tournure de ma phrase etait équivoque :
Citation :
Les traits d'union et les pluriels sont une vraie misère !
ne visait pas ton code mais les règles du français.
Pour avoir fait ce bout de programme ( en VBA poour Excel ) il y a quelques années, je me souviens mettre bien pris la tête avec toutes les règles du français.
Euh, et si on aidait anszy8 sur la programmation et qu'on lui laisse le plaisir de se démerder avec le français :) 

anszy8>> Le code VBA peut t'aider ? Après tout, s'il peut aider un autre, je le récupère et le poste à tout hasard quand même
Expert Programmation

Ta ta ta ta ta !!!!!

80 : quatre-vingts
81 : quatre-vingt-un --> Emmanuel et Nicolas ont donc raison, zeb a tord

Les traits d'union oui, mais seulement entre les mots désignant un nombre, donc pas autour de et

Fichtre, je me souvenais bien que cétait très chiant mais pas à ce point.

Je suis de plus en plus d'accord avec moi-même : anszy8, on t'aide pour la programmation et toi tu te débrouilles pour le français (belge, suisse, etc.)

Laissons de côté l'orthographe des nombres ce qui n'est pas le plus grand problème....

J'ai un p'tite question pour Emmanuel Delahaye.

Pourquoi le logiciel DEV C++ m'indique pour les deux premières lignes du programme :

ed\inc\fstr.h: No such file or directory

ed\inc\sys.h: No such file or directory

Merci d'avance de votre aide.

:bounce: 

Liluleyra a dit :
Pourquoi le logiciel DEV C++ m'indique pour les deux premières lignes du programme :

ed\inc\fstr.h: No such file or directory

ed\inc\sys.h: No such file or directory


Parce qu'il faut installer le code manquant sur ta machine. J'ai donné le lien...
Citation :
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
Lassé par la pub ? Créez un compte