Convertisseur chiffres - lettres (pour chèques par exemple)

Soyez le premier à donner votre avis sur cette source.

Vue 42 051 fois - Téléchargée 32 959 fois

Description

Voilà, c'est juste un petit code permettant de transformer un truc du type "123.51" en "cent vingt trois euros cinquante et un centimes".
Je me suis moi même inspiré d'une source c++ que j'ai transformée en c# et optimisée (ajout des chiffres après la virgule, et correction des erreurs existantes).

Ca peut servir par exemple pour des impressions de chèques (pour pas avoir le montant à taper à la main...)

Conclusion :


1er code ajouté ! Merci pour le site bien sympa quand on débute et quand on est dans la m...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.