convertir un nombre en lettre

anszy8

Habitué
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
 

Emmanuel Delahaye

Expert

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...
 

anszy8

Habitué

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

Emmanuel Delahaye

Expert

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

 

anszy8

Habitué

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.
 

Emmanuel Delahaye

Expert


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.
 

anszy8

Habitué


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

Emmanuel Delahaye

Expert

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 :



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

Exemples en Visual BASIC :

http://access.jessy.free.fr/htm/Number/ConvertNbLettres.htm

En C# (on s'approche !)


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



(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)
[cpp]
#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);
}
}
/* 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);
}
}
/* 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);
}
}
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;
}
[/cpp]
La partie rigolote étant celle-ci (du moins en français, c'est moins drôle en belge) :
(CORRIGEE)
[fixed]
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'
[/fixed]
 

anszy8

Habitué



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

zeb

Modérateur
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
 

Emmanuel Delahaye

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

 

zeb

Modérateur
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 :
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
 

zeb

Modérateur
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.)
 

Brifa_Arsai

Nouveau membre
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:

 

Emmanuel Delahaye

Expert


Parce qu'il faut installer le code manquant sur ta machine. J'ai donné le lien...
Enfin, un petit essai que je viens de coder en m'aidant de ma bibliothèque personnelle (mais publique).

 

zeb

Modérateur
[strike]Brifa_Arsai, tu es prié de faire un autre sujet pour poser des questions sans rapport avec le début !!!![/strike]
Au temps pour moi !
 

Emmanuel Delahaye

Expert
Brifa_Arsai, tu es prié de faire un autre sujet pour poser des questions sans rapport avec le début !!!!
Hum... C'est en rapport avec un code que j'ai publié dans ce thread...

 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 131
Messages
6 717 974
Membres
1 586 384
Dernier membre
ChelseaKahn
Partager cette page
Haut