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 :
Vous devez être
connecté pour voir les liens.
Il existe probablement des réalisations sur le net. :google: est ton ami...
Exemples en Visual BASIC :
Vous devez être
connecté pour voir les liens.
http://access.jessy.free.fr/htm/Number/ConvertNbLettres.htm
En C# (on s'approche !)
Vous devez être
connecté pour voir les liens.
Enfin, un petit essai que je vens de coder en m'aidant de ma bibliothèque personnelle (mais publique).
Vous devez être
connecté pour voir les liens.
(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 ?
[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 <= 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);
}
}
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) :
[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-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'
[/fixed]