martes, 16 de noviembre de 2010

Convertir Numeros a Letras.... en c#

Hace unos meses tuve la necesidad de hacer un trabajo de la escuela, donde habia un modulo que tenia que convertir una cifra a su correspondiente en letras. Debido a que tenia tiempo me puse en una tardecita a ver que salia, y pus salio esto.


El código que hice es el siguiente:


/////////////////////////

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NumLetras
{
    /// <summary>
    /// CLASE PARA CONVERTIR DE NUMEROS A LETRAS
    /// AUNQUE POR EL MOMENTO SOLO CONVIERTE DE 0.00 HASTA 99999999.99
    /// AUNQUE IGNORO SI ALGUIEN EN SUS PROYECTOS MANEJARÁ CANTIDADES SUPERIORES A LOS
    /// CIEN MILLONES
    /// :)
    /// ESTA CLASE LA HICE EL MARTES 16 DE FEBRERO del 2010(PORQUE ME HACIA FALTA PARA UNA TAREA) :(
    /// CUALQUIER ACLARACION, CORRECCION O MEJORA AL CODIGO FUENTE
    /// ENVIAR CORREO A
    /// bers_1987@hotmail.com
    /// ESTARE AGRADECIDO POR SUS COMENTARIOS
    /// PARA HACER USO PUS YA SABEN
    /// DE ESTA FORMA
    /// Console.WriteLine(new ConvierteNumLetras().ConvierteaLetras(99999999.99));
    /// O DE LA FORMA QUE QUIERAN
    /// </summary>
    public class ConvierteNumLetras
    {


        string[] unidades = new string[]
        {
            "CERO",
            "UN",
            "DOS",
            "TRES",
            "CUATRO",
            "CINCO",
            "SEIS",
            "SIETE",
            "OCHO",
            "NUEVE"
         };

        string[] decenas = new string[]
        {
            "DIE",
            "ONCE",
            "DOCE",
            "TRECE",
            "CATORCE",
            "QUINCE",
            "VEINT",
            "TREINTA",
            "CUARENTA",
            "CINCUENTA",
            "SESENTA",
            "SETENTA",
            "OCHENTA",
            "NOVENTA"
        };

        string[] centenas = new string[]
        {
            "",
            "CIEN",
            "DOSCIENTOS",
            "TRESCIENTOS",
            "CUATROCIENTOS",
            "QUINIENTOS",
            "SEISCIENTOS",
            "SETECIENTOS",
            "OCHOCIENTOS",
            "NOVECIENTOS"
        };
        /// <summary>
        /// convierte un numero double a su correspondiente en letras
        /// </summary>
        /// <param name="cantidad">cantidad a convertir</param>
        /// <returns>una cadena con la cantidad convertida</returns>
        public string ConvierteaLetras(double cantidad)
        {

            double millon = 1000000;
            double cienmiles = 100000;
            double miles = 10000;
            double mil = 1000;

            string unidad = " PESO ";
            string letras = "";
            string[] decim = cantidad.ToString().Split(new char[] { '.' });
            string decimales = "00/100 M.N";
            if (decim.Length > 1)
            {
                decimales = decim[1].PadRight(2, '0') + "/100 M.N";
            }
            cantidad = double.Parse(cantidad.ToString().Split(new char[] { '.' })[0]);

            if (cantidad <= 0)//si cantidad es igual o menor a cero
            {
                letras = "CERO";
            }

            if (cantidad>1)//es un peso
            {
                unidad=" PESOS ";
            }
           
            //INICIA
            if ((cantidad / millon) >= 1)//con los millones
            {
                int indice = (int)(cantidad / millon);//el (int) es un cast, ya que el resultado de dividir cantidad/millon me daria un double asi que le hago el cast a int

                if (indice <= 9)//menos de 10 millones
                {
                    if (indice > 1)
                    {
                        letras = unidades[indice] + " MILLONES";
                    }
                    else
                    {
                        letras = unidades[indice] + " MILLON";
                    }
                }

                if (indice >= 10 && indice <= 15)//igual o mayor de 10 pero menor o igual de 15
                {
                    if (indice == 10)
                    {
                        letras = decenas[indice % 10] + "Z MILLONES";
                    }
                    else
                    {
                        letras = decenas[indice % 10] + " MILLONES";
                    }
                }
                if (indice >= 16 && indice <= 19) // de 16-19 millones
                {
                    letras = decenas[0] + "CI " + unidades[indice % 10] + " MILLONES";
                }
                if (indice >= 20 && indice <= 99)//mas de 20 millones pero menos de 99
                {
                    if (indice > 20 && indice < 30)//por si es 21-29
                    {
                        if ((indice % 10) == 0)
                        {
                            letras = decenas[(indice / 10) + 4] + " E MILLONES";
                        }
                        else
                        {
                            letras = decenas[(indice / 10) + 4] + "I Y " + unidades[indice % 10] + " MILLONES";
                        }
                    }
                    else
                        if ((indice % 10) > 0)//para saber si poner el "Y" a la cadena ejemplo 99 seria noventa Y nueve
                        {
                            letras = decenas[(indice / 10) + 4] + " Y " + unidades[indice % 10] + " MILLONES";
                        }
                        else//en esta caso seria 90
                        {
                            letras = decenas[indice / 10 + 4] + " MILLONES";
                        }

                }

                cantidad = cantidad % millon;//termino con los millones ahora quedan los cienmiles

            }

            if ((cantidad / cienmiles) >= 1)//los cien miles
            {
                int indice = (int)(cantidad / cienmiles);

                if (indice >= 1)//si tiene cienmiles, si es 999,999 se salta al siguiente if
                {
                    letras += " " + centenas[indice];
                }
                cantidad = cantidad % cienmiles;

                if (cantidad == 0)//solo es cien pongo el mil
                {
                    letras += " MIL";
                }
            }

            if ((cantidad / miles) >= 1)//los diez miles
            {
                int indice = (int)(cantidad / miles);
                if (indice > 1)//mayor de  20 mil, aqui solo pongo los miles
                {
                    letras += " " + decenas[indice + 4];
                }

                if ((indice == 2) && (cantidad % miles) == 0)//si da 20 seria veinte
                {
                    letras += "E";
                }
                else if (indice == 2)//caso contrario seria veinti
                {
                    letras += "I";
                }
                if (indice > 1)//ya tengo puesto los miles le pongo sus unidades
                {
                    letras += " Y " + unidades[(int)(cantidad % miles) / 1000] + " MIL";
                }

                if ((cantidad / mil) >= 10 && (cantidad / mil) <= 19)//si esta entre 11-15
                {
                    indice = (int)(cantidad / mil);
                    if (indice == 10)//igual a 10 mil
                    {
                        letras += " " + decenas[0] + "Z MIL";
                    }
                    if (indice > 10 && indice < 16)//entre 11 y 15 mil
                    {
                        letras += " " + decenas[(indice % 10)] + " MIL";
                    }
                    if (indice > 15)//mayor de 15 mil
                    {
                        letras += " " + decenas[(indice / 10) - 1] + "CI" + unidades[indice % 10] + " MIL";
                    }

                }
                cantidad = cantidad % mil;

            }
            //else if ((cantidad>0)&&((cantidad % 100000) == 0))//si solo es por ejemplo 900000
            //{
            //    letras += " MIL";
            //}
            //si no llega a diez mil
            //por ejemplo 9999
            //este error lo encontre de pura cagada
            //cuando probaba el codigo
            if ((cantidad / 1000) >= 1)//los miles
            {
                int indice = (int)(cantidad / 1000);
                letras += " " + unidades[indice] + " MIL";
                cantidad = cantidad % 1000;
            }
            if ((cantidad / 100) >= 1 || (cantidad / 10) >= 1 || (cantidad / 1) >= 1)//y por ultimo la colita, las centenas, decenas o unidades
            {
                int indice = (int)(cantidad / 100);

                if (indice >= 1)//tiene centenas 100
                {
                    if (indice == 1 && (cantidad % 100) > 0)//si es 110 seria cien + to
                    {
                        letras += " " + centenas[indice] + "TO";
                    }
                    else
                    {
                        letras += " " + centenas[indice];
                    }
                }
                cantidad = cantidad % 100;//las decenas

                if (cantidad < 10 && cantidad > 0)//del 1-9
                {
                    if (cantidad > 1)//del 2-9
                    {
                        letras += " " + unidades[(int)cantidad];
                    }
                    else//es uno, le pongo la o al final para que sea "uno"
                    {
                        letras += " " + unidades[(int)cantidad];
                    }

                }
                if (cantidad >= 10 && cantidad <= 15)//del 10-15
                {
                    if (cantidad == 10)
                    {
                        letras += " " + decenas[(int)(cantidad % 10)] + "Z";
                    }
                    else
                    {
                        letras += " " + decenas[(int)(cantidad % 10)];
                    }
                }
                if (cantidad >= 16)//del 16-99
                {
                    if ((int)(cantidad / 10) == 1)//del del 16-20
                    {
                        letras += " " + decenas[0] + "CI" + unidades[(int)(cantidad % 10)];

                    }
                    else if ((int)(cantidad / 10) > 1) //del 20 en adelante
                    {
                        if ((int)(cantidad / 10) == 2)
                        {
                            if ((cantidad % 10) > 0)
                            {
                                letras += " " + decenas[(int)(cantidad / 10) + 4] + "I" + unidades[(int)(cantidad % 10)];
                            }
                            else
                            {
                                letras += " " + decenas[(int)(cantidad / 10) + 4] + "E";
                            }
                        }
                        else
                        {
                            if ((cantidad % 10) > 0)
                            {
                                letras += " " + decenas[(int)(cantidad / 10) + 4] + " Y " + unidades[(int)(cantidad % 10)];
                            }
                            else
                            {
                                letras += " " + decenas[(int)(cantidad / 10) + 4];
                            }
                        }
                    }
                }
            }
            return letras.Trim() + unidad + decimales;
        }
    }

}
 

////////////////////////////////////////////////////////////////
Si tienen alguna mejora(que estoy seguro que la hay), no duden en comentarla....os agradeceria...

2 comentarios:

  1. Hey que puedo hacer cuando me tira el error del:
    "Error 1 The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?) C:\Users\Victor Corpeño\Documents\Visual Studio 2005\Projects\ConsoleApplication6\ConsoleApplication6\Program.cs 3 14 ConsoleApplication6
    " Que proviene de esto : using System.Linq;
    Que puedo hacer??
    no soy un experto aun y necesito ayuda por favor!

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