nJohn
Messages postés2Date d'inscriptionlundi 11 février 2008StatutMembreDernière intervention 5 mai 2010 5 mai 2010 à 10:54
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 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");
}
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);
// 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]);
}
// 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;
}
}
cs_phaum1967
Messages postés1Date d'inscriptionlundi 29 décembre 2008StatutMembreDernière intervention29 décembre 2008 29 déc. 2008 à 17:50
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
biloutelinux
Messages postés7Date d'inscriptionmercredi 17 septembre 2008StatutMembreDernière intervention23 décembre 2008 23 déc. 2008 à 20:22
il manque un break à la fin des switchs, et quelques trucs en plus
22 févr. 2016 à 20:31
5 mai 2010 à 10:54
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;
}
}
29 déc. 2008 à 17:50
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
23 déc. 2008 à 20:22