Ejemplo:
Creamos la siguiente clase C#
using System; namespace TyroDeveloper { public class NumeroLetra { private string[] sUnidades = {"", "un", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez", "once", "doce", "trece", "catorce", "quince", "dieciseis", "diecisiete", "dieciocho", "diecinueve", "veinte", "veintiún", "veintidos", "veintitres", "veinticuatro", "veinticinco", "veintiseis", "veintisiete", "veintiocho", "veintinueve"}; private string[] sDecenas = { "", "diez", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" }; private string[] sCentenas = { "", "ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos" }; private string sResultado = ""; public string ConvertirCadena(string sNumero){ double dNumero; double dNumAux = 0; char x; string sAux; sResultado = " "; try{ dNumero = Convert.ToDouble(sNumero); } catch{ return ""; } if (dNumero > 999999999999) return ""; if (dNumero > 999999999){ dNumAux = dNumero % 1000000000000; sResultado += Numeros(dNumAux, 1000000000) + " mil "; } if (dNumero > 999999) { dNumAux = dNumero % 1000000000; sResultado += Numeros(dNumAux, 1000000) + " millones "; } if (dNumero > 999) { dNumAux = dNumero % 1000000; sResultado += Numeros(dNumAux, 1000) + " mil "; } dNumAux = dNumero % 1000; sResultado += Numeros(dNumAux, 1); //Enseguida verificamos si contiene punto, //si es así, los convertimos a texto. sAux = dNumero.ToString(); if (sAux.IndexOf(".") >= 0) sResultado += ObtenerDecimales(sAux); //Las siguientes líneas convierten //el primer caracter a mayúscula. sAux = sResultado; x = char.ToUpper(sResultado[1]); sResultado = x.ToString(); for (int i = 2; i < sAux.Length; i++) sResultado += sAux[i].ToString(); return sResultado; } public string ConvertirNumero(double dNumero) { double dNumAux = 0; char x; string sAux; sResultado = " "; if (dNumero > 999999999999) return ""; if (dNumero > 999999999){ dNumAux = dNumero % 1000000000000; sResultado += Numeros(dNumAux, 1000000000) + " mil "; } if (dNumero > 999999){ dNumAux = dNumero % 1000000000; sResultado += Numeros(dNumAux, 1000000) + " millones "; } if (dNumero > 999) { dNumAux = dNumero % 1000000; sResultado += Numeros(dNumAux, 1000) + " mil "; } dNumAux = dNumero % 1000; sResultado += Numeros(dNumAux, 1); //Enseguida verificamos si contiene punto, //si es así, los convertimos a texto. sAux = dNumero.ToString(); string varDecimales = ""; if (sAux.IndexOf(".") >= 0){ varDecimales = ObtenerDecimales(sAux); } else{ varDecimales = ""; } sResultado += varDecimales; //Las siguientes líneas convierten //el primer caracter a mayúscula. sAux = sResultado; x = char.ToUpper(sResultado[1]); sResultado = x.ToString(); for (int i = 2; i < sAux.Length; i++) sResultado += sAux[i].ToString(); return sResultado; } private string Numeros(double dNumAux, double dFactor){ double dCociente = dNumAux / dFactor; double dNumero = 0; int iNumero = 0; string sNumero = ""; string sTexto = ""; if (dCociente >= 100){ dNumero = dCociente / 100; sNumero = dNumero.ToString(); iNumero = int.Parse(sNumero[0].ToString()); sTexto += this.sCentenas[iNumero] + " "; } dCociente = dCociente % 100; if (dCociente >= 30) { dNumero = dCociente / 10; sNumero = dNumero.ToString(); iNumero = int.Parse(sNumero[0].ToString()); if (iNumero > 0) sTexto += this.sDecenas[iNumero] + " "; dNumero = dCociente % 10; sNumero = dNumero.ToString(); iNumero = int.Parse(sNumero[0].ToString()); if (iNumero > 0) sTexto += "y " + this.sUnidades[iNumero] + " "; } else{ dNumero = dCociente; sNumero = dNumero.ToString(); if (sNumero.Length > 1) if (sNumero[1] != '.') iNumero = int.Parse(sNumero[0].ToString() + sNumero[1].ToString()); else iNumero = int.Parse(sNumero[0].ToString()); else iNumero = int.Parse(sNumero[0].ToString()); sTexto += this.sUnidades[iNumero] + " "; } return sTexto; } private string ObtenerDecimales(string sNumero){ string[] sNumPuntos; string sTexto = ""; double dNumero = 0; sNumPuntos = sNumero.Split('.'); dNumero = Convert.ToDouble(sNumPuntos[1]); sTexto = "punto " + Numeros(dNumero, 1); return sTexto; } } }
El código que muestra el numero convertido a letra:
try{ if (txtNumero.Text != ""){ NumeroLetra num = new NumeroLetra(); txtNumeroLetra.Text = num.ConvertirCadena(txtNumero.Text).ToUpper(); } } catch (Exception ex) { txtNumeroLetra.Text = ex.Message; }
Autor de la clase: Santos.
Si te ha gustado este tutorial, regálame un +1
Buen algoritmo, gracias. Una adición: Si el CultureInfo pone coma en vez de punto en los decimales, algunas operaciones como
ResponderEliminariNumero = int.Parse(sNumero[0].ToString() + sNumero[1].ToString());
marcan error. Para ello, lo mejor es definir un CultureInfo como invariant a nivel de clase o hacer la conversión a ToString pasandolo de forma explicita (e.g. sNumero[0].ToString(CultureInfo.InvariantCulture) )
Gracias y saludos
Gracias, me ayudo bastante tu algoritmmo, saludos!!
ResponderEliminarHola amigo un favor podrias por favor explicarme como implementar este codigo en printdocument, en el area de codigo personalizado por favor te lo voy agrader mucho gracias
ResponderEliminar