1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| static std::string unite[10]={"","un","deux","trois","quatre","cinq","six",
"sept","huit","neuf"};
static std::string dixplus[7]={"dix","onze","douze","treize","quatorze","quinze","seize"};
static std::string dizaine[10]={"dix","vingt","trente","quarante","cinquante",
"soixante","quatre-vingt","nonante"};
/* je m'arrete à 10 exposant 15... c'est déjà pas si mal :D (cf [7])*/
static std::string exposants[6]={"","mille","million","milliard","trilliard","quadrilliard"};
/* pourrait prendre les termes de "billion","trillion","quadrillion"..." */
/* il faut prendre le zero en compte cf([8])*/
if(separated.size()==1 && separated[0]==0)
{
std::cout<<"zero ";
}
else
{
/* on parcoure le tableau à reculons, en utilisant la place d'origine
* de la valeur testée
*/
/* pour faciliter la suite */
bool multiplied=false;
for(size_t i=separated.size()-1;i>=0;i--)
{
/* on récupère la valeur, et on commence par gérer unités, dizaines
* et centaines
*/
int valeur=separated[i];
multiplied= multiplied||valeur>0;
switch (i%3)
{
case 0: /* c'est une unité */
std::cout<< unites[valeur]<<" ";
break;
case 1: /* c'est une dizaine */
/* dans bien des cas, l'unite devient importante */
int temp=separated[i-1];
if(valeur==1)/* cfr[6] */
{
if(temp<7)
{
std::cout<<dixplus[10+temp]<<" ";
i--;
}
else
{
std::cout<<dizaine[valeur]<<"-";
}
}
else if(valeur==8) /* cfr[3] */
{
std::cout<<dizaine[valeur]
<<(temp==0 ? "s ":"-");
}
else /* règle générale */
{
std::cout<<dizaine[valeur];
if(temp==0)
std::cout<<" ";
else if(temp==1)
std:: cout<<" et ";
else
cout<<"-";
}
break;
case 2: /* gérer les centaines */
int t1=separated[i-2]; /* unite */
int t2=separated[i-1]; /* dizaine */
if(valeur>1 && t1==0 && t2==0)/* (cf [2]) */
std::cout<<"cents ";
else
std::cout<<"cent ";
break;
default: /* juste pour éviter l'avertissement du compilateur */
}
/* reste à gérer les exposants */
if(i>3 && i%3==0) /* cf [4],[5] et [7] */
{
std::cout<<exposant[i/3]
<<( (i/3>1 && multiplied) ? "s ":" ";
multiplied=false;
}
}
} |
Partager