128 messaggi dal 01 novembre 2012
Buongiorno,

riporto il codice che ho modificato funzionante per ottenere la conversione da un numero in lettere tranne i decimali converte solo numeri interi.
I tentativi fatti con esito negativo inserendo il punto, la virgola e la barra.

Ringrazio anticipatamente e fiducioso di un gradito suggerimento, saluto.
Domenico.

string[] numeri1_19 =  { 
         "","uno", "due", "tre", "quattro", "cinque","sei", "sette", "otto", "nove", "dieci", "undici", 
          "dodici", "tredici", "quattordici","quindici", "sedici", "diciassette", "diciotto","diciannove" };
        string[] decine = { "", "", "venti", "trenta","quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta" };
        string[] centinaia = { "", "cento", "duecento", "trecento","quattrocento", "cinquecento", "seicento","settecento", "ottocento",  novecento" }; 
   int[] v = new int<img src="/forum/skins/default/images/emo/png-blue/icon_smile_8ball.png" class="absmiddle emoticon" />;
        
        private void TextBox_KeyPress(object sender, KeyPressEventArgs e        
if (e.KeyChar == 13 && TextBox.Text != "")
   {
       Btn_Converti_Click(sender, e);
    }
if (char.IsDigit(e.KeyChar))
    {
       string temp = TextBox.Text + e.KeyChar.ToString();
 if (Convert.ToInt32(temp) >= 0) return;
    }
       e.KeyChar = (char)0;
    }
private void Btn_Converti_Click(object sender, EventArgs e)
{
  if (TextBox.Text == "") return;
      Label3.Text = (convertiinlettere(Convert.ToInt32(TextBox.Text)));
      TextBox.Text = "";
      TextBox.Focus();        
}

string convertiinlettere (int num)
{
  if(num<20) return numeri1_19[num];
     int nc = 0;
     int temp = num;
     while (temp > 0)
{
   temp /= 10;
   nc++;
}
  temp=num;
  int cifra;
for(int i=nc;i!=0;i--)
{
  cifra=(int)(temp/Math.Pow(10,i-1));
  temp-=(int) (cifra*Math.Pow(10,i-1));
   v[i-1]=cifra;    
 } 
 string mila,milioni;
  switch(nc)
{
   case(2): //decine-unità
   return Dec_uni(v[1],v[0]);
    case(3)://centinaia-decine-unità
   return centinaia[v[2]]+Dec_uni(v[1],v[0]);
        case(4)://migliaia-centinaia-decine-unità
          if(num<2000) return "mille"+centinaia[v[2]]+Dec_uni(v[1],v[0]);  
          return numeri1_19[v[3]]+"mila"+centinaia[v[2]]+Dec_uni(v[1],v[0]);
        case(5)://decine di migliaia-centinaia-decine-unità
          return Dec_uni(v[4],v[3])+"mila"+centinaia[v[2]]+Dec_uni(v[1],v[0]);
        case(6)://centinaia di migliaia-centinaia-decine-unità
          return centinaia[v[5]]+Dec_uni(v[4],v[3])+"mila"+centinaia[v[2]]+Dec_uni(v[1],v[0]);
            case (7)://milioni-migliaia_centinaia-decine-unità
                milioni = numeri1_19[v[6]] + "milioni";
                if (v[6] == 1) milioni = "unmilione";
                mila = centinaia[v[5]] + Dec_uni(v[4], v[3]) + "mila";
                if (v[5] == 0 && v[4] == 0 && v[3] == 0) mila = "";
                if (v[5] == 0 && v[4] == 0 && v[3] == 1) mila = "mille";
                return milioni + mila + centinaia[v[2]] + Dec_uni(v[1], v[0]);
            case (8)://decine di milioni-migliaia-centinaia-decine-unità
                milioni = Dec_uni(v[7], v[6]) + "milioni";
                mila = centinaia[v[5]] + Dec_uni(v[4], v[3]) + "mila";
                if (v[5] == 0 && v[4] == 0 && v[3] == 0) mila = "";
                if (v[5] == 0 && v[4] == 0 && v[3] == 1) mila = "mille";
                return milioni + mila + centinaia[v[2]] + Dec_uni(v[1], v[0]);
            default:
                return "";
  }      
}

308 messaggi dal 08 gennaio 2011
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;
        }
    }
128 messaggi dal 01 novembre 2012
Gent.mo Mario,

ringrazio della gentilezza e disponibilità.
Lo scopo che gradirei raggiungere consiste che, inserito nella TextBox1 un numero compreso i decimali per es: 2658.69, nella Label dovrebbe essere convertito in lettere.
Fiducioso, saluto.
Domenico.
308 messaggi dal 08 gennaio 2011
Solitamente se la trascrizione in lettere è riferita ad un importo la parte decimale viene riportata in numeri. Pensa per esempio alla compilazione di un'assegno.

Questo il codice che prende un valore decimale inserito in una textBox e lo trasforma in lettere e lo scrive in una Label

decimal d = decimal.Parse(textBox1.Text);
            string v = d.ToString();
            string[] vv = v.Split(',');
            
            //la parte decimale viene scritta in lettere
            label1.Text = IntInLet.IIL(long.Parse(vv[0]), FormatoRisultato.InizialeMaiuscolo) + "," +
                IntInLet.IIL(long.Parse(vv[1]), FormatoRisultato.InizialeMaiuscolo);
            
            //la parte decimale viene scritta in numeri
            label1.Text = IntInLet.IIL(long.Parse(vv[0]), FormatoRisultato.InizialeMaiuscolo) + "/" + vv[1];


Ciao.
128 messaggi dal 01 novembre 2012
Gent.mo Mario,

ringrazio, risolto il problema.

Inserendo il punto dal tastierino numerico, andava in errore, mentre con la virgola no.

Gentilmente si potrebbe modificare dal punto alla virgola?.

Auguro un buon proseguimento di giornata, saluto.
Domenico.
308 messaggi dal 08 gennaio 2011
Se tu preferisci il punto come separatore dei decimali lo devi impostare in Windows : Start, Impostazioni, impostazioni amministrative della lingua si apre una finestra Area Geografica; In questa finestra click sulla scheda Formati e poi sul pulsante Impostazioni Aggiuntive che apre una finestra che ti permette di modificare i formati dei numeri.

Se nelle textBox usi la virgola quando nelle impostazioni hai scelto il punto o viceversa usi il punto quando hai scelto la virgola, credo sia giusto ricevere un errore;

La modifica seguente usa come separatore dei decimali quello delle impostazioni culturali di sistema.

 decimal d = decimal.Parse(textBox1.Text);
            string v = d.ToString();
            string[] vv = v.Split(char.Parse(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator));


            //la parte decimale viene scritta in lettere
            label1.Text = IntInLet.IIL(long.Parse(vv[0]), FormatoRisultato.InizialeMaiuscolo) + "," +
           IntInLet.IIL(long.Parse(vv[1]), FormatoRisultato.InizialeMaiuscolo);

            //la parte decimale viene scritta in numeri
            label1.Text = IntInLet.IIL(long.Parse(vv[0]), FormatoRisultato.InizialeMaiuscolo) + "/" + vv[1];



Ciao.
128 messaggi dal 01 novembre 2012
Gent.mo Mario,

mi scuso se riprendo, l'applicazione funziona perfettamente.
Se inserisco solo numero intero senza decimale va in errore.

Ringrazio e fiducioso saluto.
Domenico.
308 messaggi dal 08 gennaio 2011
Col codice seguente dovresti risolvere; quindi hai la possibilità di inserire interi.
 decimal d = decimal.Parse(textBox1.Text);
 string v = d.ToString() + System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
 string[] vv = v.Split(char.Parse(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator));
           
 if (vv.Length == 2) vv[1] = "00";

//la parte decimale viene scritta in lettere
label1.Text = IntInLet.IIL(long.Parse(vv[0]), FormatoRisultato.InizialeMaiuscolo) + "," +
IntInLet.IIL(long.Parse(vv[1]), FormatoRisultato.InizialeMaiuscolo);

//la parte decimale viene scritta in numeri
label1.Text = IntInLet.IIL(long.Parse(vv[0]), FormatoRisultato.InizialeMaiuscolo) + "/" + vv[1];

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.