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

3 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