#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


//Donne un mot equivalent a une valeur nimerique
char *equivalent(int intValeur){
//unites et Dizaines < 20
char *astrMot [20]= {
    "","un","deux","trois","quatre","cinq",
//   0   1    2       3       4        5
    "six","sept","huit","neuf","dix",
//                                 10
    "onze","douze","treize","quatorze","quinze",
//     11         12     13      14        15
    "seize","dix-sept","dix-huit","dix-neuf",
//     16       17         18           19

};
// Dizaines et Dizaines speciales pour 1 et 8
char *astrMotD [10] ={
    "","","vingt","trente","quarante","cinquante",
//          20       30                    50
    "soixante","soixante-dix","quatre-vingt","quatre-vingt-dix",
//      60                            90

};
// Centaines
char *astrMotC [10] = {
    "","cent","deux cent","trois cent","quatre cent","cinq cent",
//     100                                              500
    "six cent","sept cent","huit cent","neuf cent"
//       600                                 900
};

     if (intValeur < 20)
    {   return(astrMot[intValeur]);
    }
    else if (intValeur<91)
    {   return(astrMotD[(intValeur-50)]);
    }
    else if (intValeur<200)
    {   return(astrMotC[(intValeur-100)]);
    }
    return(astrMot[intValeur]);
}

//Ajoute un mot a une chaine
void AjouterMot(char strChaine[255], char strMot[25]){

int i=0;
int j=0;
int k=0;
i = strlen(strChaine);
j = strlen(strMot);

if (j!=0)
 {
    if (strlen(strChaine) != 0)
    {   if(strlen(strMot)==1 && strMot[0]=='s')// si ajoute un's'
        {   strChaine[i] = strMot[0];
            strChaine[i+1] = '\0';
        }
        else
        {   for (k =0; k <= j; k++)
            {   strChaine[i+k] = strMot[k];
            }
            strChaine[i+k+1] = '\0';
        }
    }
    else // Debut de la chaine
    {  for (k = 0; k < j; k++)
        {   strChaine[k] = strMot[k];
        }
        strChaine[k+1] ='\0';
    }
 }
}

//Traduit un nombre entier contenu dans une chaine de caracteres
//en son equivalent ordinal
void *TraduireEntier(char strChaine[255], char strNombreATraduire[20]){
//main
char strNombre[20];
int intLongueur = 0;
char strCDU [10];
char strCentaines[10]="";
char strDizaines[10]="";
char strUnites[10]="";
char strDU[10]="";

int i=0;
int intNB=0;
int intC =0;
int intD =0;
int intU =0;
int intDU =0;
int intCDU=0;


//Copie du nb a traduire
for (i=0;i<=strlen(strNombreATraduire);i++)
{strNombre[i]=strNombreATraduire[i];}
 strNombre[i]='\0';

if (strlen(strNombre)!= 0) //si strNombreATraduire pas vide
{//6
    intNB = atoi(strNombre); /*si strNombreATraduire == 0 */
    if (intNB == 0)
    {   AjouterMot(strChaine,"zero");
    }//5
    else
    {//5 ajoute des 0 a gauche du nombre afin d'avoir un multiple de 3 caract
        i =0;
        int intReste =0;int k=0;
        intLongueur = strlen(strNombre);
        intReste = fmod (intLongueur,3);
        if (intReste != 0 )
        {//4
            i= (intLongueur+3-intReste);
            for (k=0;k<=i;k++){strNombre[i-k] = strNombre[intLongueur-k];}
            for (k=2-intReste;k>=0;k--) {strNombre[k] = '0';}
            intLongueur=strlen(strNombre);
        }//4
        i=0;
        int intLong=0;
        for (intLong=strlen(strNombre);intLong>0;intLong=intLong-3)
        {//4
            for (k=0;k<3;k++){// Sort les 3 premiers caracteres dans strCDU
                strCDU[k]=strNombre[k];
                strCDU[k+1]='\0';
            }//3
            for (k=0;k<strlen(strNombre)-3;k++)
            {//supprime les 3 caracteres de strCDU dans strNombre
                strNombre[k] = strNombre[k+3];
            }//3
            strNombre[k] = '\0';
            if (atoi(strCDU)== 0 ){
                intLongueur=intLongueur-3;
            }
            else
            {//3  si non nul on separe chaque chiffre
                strCentaines[0] = strCDU[0];
                strCentaines[1]='\0';
                strDizaines[0] =strCDU[1];
                strDizaines[1]='\0';
                strUnites[0]  =strCDU[2];
                strUnites[1]='\0';
                strDU[0]= strDizaines[0];
                strDU[1]= strUnites[0];
                strDU[2]='\0';

                intC =atoi(strCentaines);
                intD =atoi(strDizaines);
                intU =atoi(strUnites);
                intDU=atoi(strDU);
                intCDU=atoi(strCDU);

                if (intC>0)
                 {  if (intDU==0)// cent au pluriel
                    {   AjouterMot(strChaine,equivalent(intC+100));
                        AjouterMot(strChaine,"s");
                    }
                    else
                    {   AjouterMot(strChaine,equivalent(intC+100));
                        AjouterMot(strChaine," ");
                    }
                }

                if (intDU<20)//Unites < 20
                {   if (intLong==6&&intCDU==1)
                    {

                    }
                     else
                    {   AjouterMot(strChaine,equivalent(intDU));
                        AjouterMot(strChaine," ");
                    }

                }
                else
                {   if ((intD==9)||(intD==7))
                    {   AjouterMot(strChaine,equivalent(intD-1+50));
                        if (intDU==71)
                        {    AjouterMot(strChaine," et ");}
                        else
                        {    AjouterMot(strChaine,"-");}
                        AjouterMot(strChaine,equivalent(intU+10));
                        AjouterMot(strChaine," ");
                    }
                    else
                    {   if ((intU==1)&&(intD!=8))
                        {   AjouterMot(strChaine,equivalent(intD+50));
                            AjouterMot(strChaine," et ");
                            AjouterMot(strChaine,equivalent(intU));
                            AjouterMot(strChaine," ");
                        }
                        else
                        {   AjouterMot(strChaine,equivalent(intD+50));
                            if (intU!=0){AjouterMot(strChaine,"-");}
                            AjouterMot(strChaine,equivalent(intU));
                            AjouterMot(strChaine," ");
                        }
                    }
                }

                switch (intLong)
                {
                case 6 :
                        {    AjouterMot(strChaine,"mille");
                            AjouterMot(strChaine," ");break;
                        }
                case 9 :
                        {   AjouterMot(strChaine,"million");
                            if (intCDU>1){AjouterMot(strChaine,"s");}
                            AjouterMot(strChaine," ");
                            break;
                        }
                case 12 :

                        {   AjouterMot(strChaine,"miliard");
                            if (intCDU>1){AjouterMot(strChaine,"s");}
                            AjouterMot(strChaine," ");
                            break;
                        }
                case 15 :
                        {   AjouterMot(strChaine,"billion");
                            if (intCDU>1){AjouterMot(strChaine,"s");}
                            AjouterMot(strChaine," ");
                            break;
                        }
                }
            }//3
        }//4 for
    }//5
 }//6
 return 0;
}//main

void *NBenLettres(char strValeur [255]){

    char strDevise [10]= "Euro";
    char strCentime [10]="ct";
    int intDigits=2;

    char strResultat [255] ="";
    char strA [20]= "";
    char strK [20]= "";
    char strN [20]= "";
    char strZ[10]="0000";
    int blnVirgule=0;
    int i=0;
    int intI=0;

//on elimine les espaces
    int k = 0;
    for (i=0;i<strlen(strValeur);i++)
    {   if (strValeur[i]==32)
        {    for (k=i;k<strlen(strValeur);k++)
            {   strValeur[k]=strValeur[k+1];
            }
        }
    }

// Copie de strValeur dans strA
    strcpy(strA,strValeur);
// AJOUTE UN ESPACE et FIN de CHAINE
    i=strlen(strA);
    strA[i]=' ';
    strA[i+1]='\0';
    for (intI = 0 ; intI < strlen(strA); intI++)
    {   strK [0]= strA [intI];//copie de un carac dans strK
        switch (strK[0])
        {   case 45 :
                AjouterMot(strResultat, "moins");break ;
            case 48 :
            case 49 :
            case 50 :
            case 51 :
            case 52 :
            case 53 :
            case 54 :
            case 55 :
            case 56 :
            case 57 :
                strcat(strN,strK);
                break ;
            default :
                if (blnVirgule==1)
                {   strcat(strN,strZ);
                    strN[intDigits]='\0';
                    strcat(strZ,strN);
                }
                TraduireEntier(strResultat,strN);

                if (blnVirgule==0&&(atoi(strN)>0))
                {   AjouterMot(strResultat,strDevise);
                    if(atoi(strN)>1)
                    {   AjouterMot(strResultat,"s");
                    }
                    AjouterMot(strResultat," ");
                }
                else
                {   if (blnVirgule&&(atoi(strN)>0))
                    {   AjouterMot(strResultat,strCentime);
                    }
                    if (atoi(strN)>1)
                    {   AjouterMot(strResultat,"s");
                    }
                }
                strN[0]='\0';
                switch (strK[0])
                {   case 13 :
                        intI=intI+1;break;
                    case 32 :
                        break;
                    case 44 :
                    case 46 :
                        blnVirgule=1;
                        break;
                }//Case2
        }//Case1
    }//for
printf(" Resultat :%s\n",strResultat);
    return (0);
}
//test
int main()
{
    char strValeu [25] = "123597695.73";

    printf("strValeur :%s\n",strValeu);

    NBenLettres( strValeu);
    return 0;
}
