convertir un nombre en lettre
Dernière réponse : dans Programmation
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
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
Autres pages sur : convertir nombre lettre
Lassé par la pub ? Créez un compte
flock a dit :
bonjourje 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...
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)
#include "ed/inc/fstr.h" #include "ed/inc/sys.h" #include <stdio.h> #include <stdlib.h> static char *num2text_dyn(int n) { char *s = NULL; fstr_s *fs = fstr_create(8); if (fs) { static char const *as_0_19[] = { "zero", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf", }; static char const *as_dizaines[] = { "???", "???", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante", "quatre-vingt", "quatre-vingt", }; if (n >= 0 && n <= 19) { fstr_cat (fs, as_0_19[n]); } else if (n >= 20 && n <= 59) { int d = n / 10; int u = n % 10; fstr_cat (fs, as_dizaines[d]); if (u != 0) { if (u == 1) { fstr_cat (fs, " et "); } else { fstr_cat (fs, " "); } fstr_cat (fs, as_0_19[u]); } } /* France */ else if (n >= 60 && n <= 79) { int d = n / 10; int u = n % 20; fstr_cat (fs, as_dizaines[d]); if (u != 0) { switch (u) { case 1: case 11: fstr_cat (fs, " et "); break; case 17: case 18: case 19: fstr_cat (fs, "-"); break; default: fstr_cat (fs, " "); } fstr_cat (fs, as_0_19[u]); } } /* France */ else if (n >= 80 && n <= 99) { int d = n / 10; int u = n % 20; fstr_cat (fs, as_dizaines[d]); if (u == 0) { fstr_cat (fs, "s"); } else { switch (u) { case 17: case 18: case 19: fstr_cat (fs, "-"); break; default: fstr_cat (fs, " "); } fstr_cat (fs, as_0_19[u]); } } else { } s = fstr_remove (fs); fstr_delete (fs), fs = NULL; } ASSERT(fs == NULL); return s; } int main (void) { int B = 60; int N = 40; int i; for (i = B; i < B + N; i++) { char *s = num2text_dyn(i); if (s != NULL) { printf ("%d = '%s'\n", i, s); free (s), s = NULL; } } return 0; }
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 ?
#include "ed/inc/fstr.h" #include "ed/inc/sys.h" #include <stdio.h> #include <stdlib.h> static char *num2text_dyn(int n) { char *s = NULL; fstr_s *fs = fstr_create(8); if (fs) { static char const *as_0_19[] = { "zero", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf", }; static char const *as_dizaines[] = { "???", "???", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante", "quatre-vingt", "quatre-vingt", }; if (n >= 0 && n <= 19) { fstr_cat (fs, as_0_19[n]); } else if (n >= 20 && n <= 59) { int d = n / 10; int u = n % 10; fstr_cat (fs, as_dizaines[d]); if (u != 0) { if (u == 1) { fstr_cat (fs, " et "); } else { fstr_cat (fs, " "); } fstr_cat (fs, as_0_19[u]); } } /* France */ else if (n >= 60 && n <= 99) { int d = n / 10; int u = n % 20; fstr_cat (fs, as_dizaines[d]); if (u != 0) { switch (u) { case 1: case 11: fstr_cat (fs, " et "); break; case 17: case 18: case 19: fstr_cat (fs, "-"); break; default: fstr_cat (fs, " "); } fstr_cat (fs, as_0_19[u]); } } else { } s = fstr_remove (fs); fstr_delete (fs), fs = NULL; } ASSERT(fs == NULL); return s; } int main (void) { int B = 60; int N = 40; int i; for (i = B; i < B + N; i++) { char *s = num2text_dyn(i); if (s != NULL) { printf ("%d = '%s'\n", i, s); free (s), s = NULL; } } return 0; }
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
Citation :
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
Ok, y'a pas de 's' à 'quatre-vingt'. A part ça ?
http://www.graner.net/nicolas/nombres/nom.php
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 : 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
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 !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
Citation :
Oui, un s à quatre-vingt, qui est invariable, des traits d'union entre tous les mots en dessous de 100.
Ce n'est pas ce que dit
http://www.graner.net/nicolas/nombres/nom.php
Mais il se trompe peut être...
Citation :
pas de et après quatre-vingts, OK.
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.)
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.
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.
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