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!!
ResponderEliminarAquí una librería gratuita que hace todo esto y mas!!! Here is a free library that does all this and more !!!
ResponderEliminarhttp://urysoft.blogspot.com.es/p/urysoftutilities.html?view=sidebar
Hola 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