CONVERTISSEUR CHIFFRES - LETTRES (POUR CHÈQUES PAR EXEMPLE)

Signaler
Messages postés
7
Date d'inscription
mercredi 17 septembre 2008
Statut
Membre
Dernière intervention
23 décembre 2008
-
 Hamza-DEV -
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/21491-convertisseur-chiffres-lettres-pour-cheques-par-exemple

Merci infiniment
Messages postés
2
Date d'inscription
lundi 11 février 2008
Statut
Membre
Dernière intervention
5 mai 2010

Bonjour, voici une évolution du source proposé.

Nouveautés :
- le code est factorisé
- conversion d'entier en lettres
- conversion de double en lettres avec devise (accordé au singulier pluriel)
- 81 est traduit par "quatre-vingt un" et pas "quatre-vingt et un"
- optimisation des concaténations des chaines de caractères
- gère les valeurs négatives

Cependant ce code ne donne pas la conversion exacte de l'écriture des nombres. Si l'on fait attention aux très nombreuses règles certaines ne sont pas prises en compte (les tirets, accords au pluriel particuliers)

public class NumberToWords
{
private static string[] m_Unite = new string[] { "zero ", "un ", "deux ", "trois ", "quatre ", "cinq ", "six ", "sept ", "huit ", "neuf " };
private static string[] m_FirstDizaine = new string[] { String.Empty, "onze ", "douze ", "treize ", "quatorze ", "quinze ", "seize ", "dix-sept ", "dix-huit ", "dix-neuf " };
private static string[] m_Dizaine = new string[] { String.Empty, "dix ", "vingt ", "trente ", "quarante ", "cinquante ", "soixante ", "soixante ", "quatre-vingt ", "quatre-vingt " };
private static string[] m_CentMille = new string[] { "cent ", "cents ", "mille ", "million ", "millions ", "milliard ", "milliards " };

private static string m_PrefixAnd = "et ";

private static string[] m_Devise = new string[] { "euro", "euros" };

private static string[] m_Centime = new string[] { "centime", "centimes" };

public static string IntegerToFrenchWords(int p_Number)
{
if (p_Number == 0)
return m_Unite[0]; // zéro

bool isNumberNeg = false;
if (p_Number < 0)
{
isNumberNeg = true;
p_Number = p_Number * -1; // PB si p_Number -2147483648> p_Number * -1 = -2147483648,
// car la valeur max d'un entier est 2147483647 et pas 2147483648
if (p_Number == Int32.MinValue)
throw new ArgumentException("Impossible de convertir en lettres le nombre " + p_Number, "p_Number");
}

// Déclarations
int centaine, dizaine, unite, reste, y;
bool is10or70or90 = false;
string intInWords = String.Empty;

reste = (int)p_Number;

for (int i = 1000000000; i >= 1; i /= 1000)
{
y = reste / i;
if (y != 0)
{
centaine = y / 100;
dizaine = (y - centaine * 100) / 10;
unite = y - (centaine * 100) - (dizaine * 10);

// Centaines
if (centaine == 1)
intInWords += m_CentMille[0];
else if (centaine > 1)
{
intInWords += m_Unite[centaine]; if ((dizaine 0) && (unite 0)) intInWords += m_CentMille[1];
else intInWords += m_CentMille[1];
}

// Convertit les dizaines et unités en lettres
intInWords += GetUniteAndDizaineWords(dizaine, unite, ref is10or70or90);

// Milliers, millions, milliards
switch (i)
{
case 1000000000:
if (y > 1) intInWords += m_CentMille[6];
else intInWords += m_CentMille[5];
break;
case 1000000:
if (y > 1) intInWords += m_CentMille[4];
else intInWords += m_CentMille[3];
break;
case 1000: // cas particulier si unité = 1 -> pas de préfix "un" intInWords unite 1 ? m_CentMille[2] : String.Concat(intInWords, m_CentMille[2]);
break;
}
}

reste -= y * i;
is10or70or90 = false;
}

if (isNumberNeg)
intInWords = "moins " + intInWords;

return intInWords;
}

public static string CurrencyNumberToFrenchWords(double p_Number)
{
if (p_Number == 0)
return m_Unite[0]; // zéro

// Déclarations
int dizaine, unite;
bool is10or70or90 = false;
string intInWords = String.Empty;

// Récupère la partie entière et détermine la devise au singulier/pluriel
int partEntiere = (int)p_Number;
string devise = partEntiere > 1 ? m_Devise[1] : m_Devise[0];

// Récupère la partie entière
intInWords = IntegerToFrenchWords(partEntiere);

// Traitement de la virgule
decimal chiffreDec;
chiffreDec = (decimal)(p_Number * 100) % 100;
dizaine = (int)(chiffreDec) / 10;
unite = (int)chiffreDec - (dizaine * 10);

// Convertit les dizaines et unités en lettres
string decInWords = GetUniteAndDizaineWords(dizaine, unite, ref is10or70or90);

if (decInWords == String.Empty)
return String.Concat(intInWords, devise); else if (dizaine 0 && unite 1)
return String.Format("{0}{1} et {2}{3}", intInWords, devise, decInWords, m_Centime[0]);
else
return String.Format("{0}{1} et {2}{3}", intInWords, devise, decInWords, m_Centime[1]);
}

private static string GetUniteAndDizaineWords(int p_Dizaine, int p_Unite, ref bool p_Is10or70or90)
{
string numberInWords = String.Empty;

// dizaines
if (p_Dizaine == 1) // Flag la dizaine particulière
{
p_Is10or70or90 = true;
}
else if (p_Dizaine > 1)
{
// Concatène avec la dizaine appropriée
numberInWords += m_Dizaine[p_Dizaine];
if (p_Dizaine 7 || p_Dizaine 9) // Flag la dizaine particulière
p_Is10or70or90 = true;
}

// unités
if (p_Unite == 0 && p_Is10or70or90)
{
numberInWords += m_Dizaine[1]; // dix
}
else if (p_Unite == 1)
{ if (p_Dizaine 7) numberInWords String.Concat(numberInWords, m_PrefixAnd, m_FirstDizaine[p_Unite]);
else
if (p_Is10or70or90) numberInWords += m_FirstDizaine[p_Unite]; else if (p_Dizaine 8) numberInWords String.Concat(numberInWords, m_Unite[p_Unite]); // cas particulier 81 pas de "et"
else if (p_Dizaine > 1) numberInWords = String.Concat(numberInWords, m_PrefixAnd, m_Unite[p_Unite]);
else numberInWords += m_Unite[1];
}
else if (p_Unite > 1)
{
if (p_Is10or70or90) numberInWords += m_FirstDizaine[p_Unite];
else numberInWords += m_Unite[p_Unite];
}

return numberInWords;
}
}
Messages postés
1
Date d'inscription
lundi 29 décembre 2008
Statut
Membre
Dernière intervention
29 décembre 2008

Bonjour
etant plus de que débutant, j'ai besoin de ce code dans Visual Web Developer 2008
J'ai donc ajouté tous les éléments à mon projet asp mais comment je l'utilise pour dire à un textbox de faire la conversion en fonction d'un autre textbox?

Merci
Messages postés
7
Date d'inscription
mercredi 17 septembre 2008
Statut
Membre
Dernière intervention
23 décembre 2008

il manque un break à la fin des switchs, et quelques trucs en plus