Numero a Letras en C#

Versión Visual Basic
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

4 comentarios:

  1. Buen algoritmo, gracias. Una adición: Si el CultureInfo pone coma en vez de punto en los decimales, algunas operaciones como

    iNumero = 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

    ResponderEliminar
  2. Gracias, me ayudo bastante tu algoritmmo, saludos!!

    ResponderEliminar
  3. Aquí una librería gratuita que hace todo esto y mas!!! Here is a free library that does all this and more !!!
    http://urysoft.blogspot.com.es/p/urysoftutilities.html?view=sidebar

    ResponderEliminar
  4. 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