Ciao,
Il codice che hai postato non mi piace tanto....
Ti propongo questa classe statica di nome IntInLet che espone un metodo denominato IIL(acronimo di intero in lettere) che accetta un long per consentire la trascrizione in lettere dei numeri compresi tra 0 e 999 miliardi e un valore di enumerazione per scegliere il formato del risultato (Maiuscolo, minuscolo, iniziale maiuscola).
Un esempio di chiamata del metodo
textBox1.Text = IntInLet.IIL (1154781, FormatoRisultato.InizialeMaiuscolo );
//Restituisce Unmilionecentocinquantaquattromilasettecentottantuno
questo il codice della classe IntInLet :
public enum FormatoRisultato { Maiuscolo, Minuscolo, InizialeMaiuscolo, }
public static class IntInLet
{
private static string[] p = {"Zero","Uno","Due","Tre","Quattro","Cinque","Sei","Sette","Otto","Nove",
"Dieci","Undici","Dodici","Tredici","Quattordici","Quindici","Sedici","Diciassette","Diciotto","Diciannove",
"Venti","Trenta","Quaranta","Cinquanta","Sessanta","Settanta","Ottanta","Novanta"};
public static string IIL(long n, FormatoRisultato fr)
{
string s = InteroInLettere(n);
switch (fr)
{
case FormatoRisultato.Maiuscolo:
return s.ToUpper();
case FormatoRisultato.Minuscolo:
return s.ToLower();
case FormatoRisultato.InizialeMaiuscolo:
return s.Substring(0, 1).ToUpper() + s.Substring(1, s.Length - 1).ToLower();
}
return null;
}
private static string InteroInLettere(long n)
{
if (n < 0 || n > 999999999999)
{
throw new ArgumentException("E' possibile trascrivere in lettere solo i numeri interi da 0 a 999.999.999.999");
}
string ns = n.ToString().PadLeft(12, '0');
StringBuilder sb = new StringBuilder();
string Miliardi = ns.Substring(0, 3);
string Milioni = ns.Substring(3, 3);
string Migliaia = ns.Substring(6, 3);
string Unità = ns.Substring(9, 3);
if (int.Parse(Miliardi) > 0)
{
sb.Append(RisGruppo(Miliardi) + "Miliardi");
}
if (int.Parse(Milioni) > 0)
{
sb.Append(RisGruppo(Milioni) + "Milioni");
}
if (int.Parse(Migliaia) > 0)
{
sb.Append(RisGruppo(Migliaia) + "Mila");
}
if (int.Parse(Unità) > 0)
{
sb.Append(RisGruppo(Unità));
}
else
{
if (sb.Length == 0) sb.Append(RisGruppo(Unità));
}
string ris = sb.ToString().Replace("UnoMiliardi", "UnMiliardo").
Replace("UnoMilioni", "UnMilione").
Replace("UnoMila", "Mille");
return ris;
}
private static string RisGruppo(string s)
{
StringBuilder sb = new StringBuilder();
if (int.Parse(s.Substring(0, 1)) > 0)
{
if (int.Parse(s.Substring(0, 1)) == 1)
{
sb.Append("Cento");
}
else
{
sb.Append(p[int.Parse(s.Substring(0, 1))] + "Cento");
}
}
if (int.Parse(s.Substring(1, 2)) > 20)
{
if (int.Parse(s.Substring(2, 1)) > 0)
{
sb.Append(p[20 + int.Parse(s.Substring(1, 1)) - 2] + p[int.Parse(s.Substring(2, 1))]);
}
else
{
sb.Append(p[20 + int.Parse(s.Substring(1, 1)) - 2]);
}
}
else
{
sb.Append(p[int.Parse(s.Substring(1, 2))]);
}
string ris = sb.ToString().Replace("CentoZero", "Cento").
Replace("aO", "O").
Replace("aU", "U").
Replace("iO", "O").
Replace("iU", "U").
Replace("oO", "O");
return ris;
}
}