Convertir Número a Letras en C# – Por Gerardo

Gracias Gerardo…. adjunto el código para C#, por si algún otro usuario lo llegara a necesitar.


 


Para VB.NET http://msmvps.com/blogs/jvargas/pages/convertirnumeroletras.aspx


 


Gracias por tu aporte.


 


:)


 


 


using System;


using System.Collections.Generic;


using System.Text;


namespace Conversiones


{


   class Conv


   {


       public string enletras(string num)


       {


           string res, dec = “”;


           Int64 entero;


           int decimales;


           double nro;


           try


           {


               nro = Convert.ToDouble(num);


           }


           catch


           {


               return “”;


           }


           entero = Convert.ToInt64(Math.Truncate(nro));


           decimales = Convert.ToInt32(Math.Round((nro – entero) * 100, 2));


           if (decimales > 0)


           {


               dec = ” CON ” + decimales.ToString() + “/100″;


           }


           res = toText(Convert.ToDouble(entero)) + dec;


           return res;


       }


       private string toText(double value)


       {


           string Num2Text = “”;


           value = Math.Truncate(value);


           if (value == 0) Num2Text = “CERO”;


           else if (value == 1) Num2Text = “UNO”;


           else if (value == 2) Num2Text = “DOS”;


           else if (value == 3) Num2Text = “TRES”;


           else if (value == 4) Num2Text = “CUATRO”;


           else if (value == 5) Num2Text = “CINCO”;


           else if (value == 6) Num2Text = “SEIS”;


           else if (value == 7) Num2Text = “SIETE”;


           else if (value == 8) Num2Text = “OCHO”;


           else if (value == 9) Num2Text = “NUEVE”;


           else if (value == 10) Num2Text = “DIEZ”;


           else if (value == 11) Num2Text = “ONCE”;


           else if (value == 12) Num2Text = “DOCE”;


           else if (value == 13) Num2Text = “TRECE”;


           else if (value == 14) Num2Text = “CATORCE”;


           else if (value == 15) Num2Text = “QUINCE”;


           else if (value < 20) Num2Text = “DIECI” + toText(value – 10);


           else if (value == 20) Num2Text = “VEINTE”;


           else if (value < 30) Num2Text = “VEINTI” + toText(value – 20);


           else if (value == 30) Num2Text = “TREINTA”;


           else if (value == 40) Num2Text = “CUARENTA”;


           else if (value == 50) Num2Text = “CINCUENTA”;


           else if (value == 60) Num2Text = “SESENTA”;


           else if (value == 70) Num2Text = “SETENTA”;


           else if (value == 80) Num2Text = “OCHENTA”;


           else if (value == 90) Num2Text = “NOVENTA”;


           else if (value < 100) Num2Text = toText(Math.Truncate(value / 10) * 10) + ” Y ” + toText(value % 10);


           else if (value == 100) Num2Text = “CIEN”;


           else if (value < 200) Num2Text = “CIENTO ” + toText(value – 100);


           else if ((value == 200) || (value == 300) || (value == 400) || (value == 600) || (value == 800)) Num2Text = toText(Math.Truncate(value / 100)) + “CIENTOS”;


           else if (value == 500) Num2Text = “QUINIENTOS”;


           else if (value == 700) Num2Text = “SETECIENTOS”;


           else if (value == 900) Num2Text = “NOVECIENTOS”;


           else if (value < 1000) Num2Text = toText(Math.Truncate(value / 100) * 100) + ” ” + toText(value % 100);


           else if (value == 1000) Num2Text = “MIL”;


           else if (value < 2000) Num2Text = “MIL ” + toText(value % 1000);


           else if (value < 1000000)


           {


               Num2Text = toText(Math.Truncate(value / 1000)) + ” MIL”;


               if ((value % 1000) > 0) Num2Text = Num2Text + ” ” + toText(value % 1000);


           }


           else if (value == 1000000) Num2Text = “UN MILLON”;


           else if (value < 2000000) Num2Text = “UN MILLON ” + toText(value % 1000000);


           else if (value < 1000000000000)


           {


               Num2Text = toText(Math.Truncate(value / 1000000)) + ” MILLONES “;


               if ((value – Math.Truncate(value / 1000000) * 1000000) > 0) Num2Text = Num2Text + ” ” + toText(value – Math.Truncate(value / 1000000) * 1000000);


           }


           else if (value == 1000000000000) Num2Text = “UN BILLON”;


           else if (value < 2000000000000) Num2Text = “UN BILLON ” + toText(value – Math.Truncate(value / 1000000000000) * 1000000000000);


           else


           {


               Num2Text = toText(Math.Truncate(value / 1000000000000)) + ” BILLONES”;


               if ((value – Math.Truncate(value / 1000000000000) * 1000000000000) > 0) Num2Text = Num2Text + ” ” + toText(value – Math.Truncate(value / 1000000000000) * 1000000000000);


           }


           return Num2Text;


       }


   }


}

39 thoughts on “Convertir Número a Letras en C# – Por Gerardo”

  1. Bien me parece fabuloso que expertos compartan informacion para seguir en la linea de aprendizaje gracias

  2. UM DOC NO ENTIENDO JUSTO TENO ESTA PRACTICA CONVERSION DE NUMERO A LETRAS DESPOES BINARIO A ARABIGOS CONVERSION SEXAGECIMAL.
    MI MSN: tonny0412@hotma———-

  3. Graxias por compartir código y darnos una idea de mas o menos como va la cosa, para ver si se puede mejorar o tomar el kernel del algoritmo :)

    Saludos.

  4. Trabaja excelentemente tu programa ademas el ejemplo que pones deja todo mas claro, muchisimas gracias me has salvado de hacerlo o traducir alguno en ingles jeje gracias, y ademas llega hasta billones jeje muy bueno.

  5. Aww cabrón.. muchas gracias, ademas si quieres que te de los centavos también con letra, lo pueden hacer recursivo, es decir, en:

    if (decimales > 0)

    {

    dec = ” CON ” +enletras( decimales.ToString()) + “CENTAVOS”;

    }

  6. Shiale!
    Que buen aporte man…
    Tan bueno que ya van casi 3 años y sigue sirviendo bien chido!!!
    Gracias, Totales!!!

  7. Esta superbien este código, pero lo que no me queda claro es para que sirve el tanto porciento (value % 1000), que es lo que hace???

  8. que tal bueno pues soy algo nuevo en esto de la programacion y no entiendo como mandar a llamar la clase , lo que pasa es que tengo en mi form un textbox y un boton y mande a llamar la clase en el metodo pero no hace nada .
    me podrian decir en que estoy fallando
    es algo urgente me salvarian la vida
    espero y me puedan ayudar
    GRACIAS

  9. Hola, alguien me podría ayudar en la duda que tengo porfavor, lo que pasa que es la primera vez que trabajo con clases en C#, entonces nose como llamarla o hacerla funcionar para ver el resultado en la interfaz gráfica.
    Gracias.

  10. Hola a todos, muchas gracias Gerardo!!, te luciste, me has ahorrado como 3 o 4 horas, ahora podré chatear un rato jojo, no se crean, haciendo revisión del código vi que podía hacerle algunas MEJORAS, muy pocas en realidad porque está muy bien hecho, encontré que tiene problemas al momento de generar algo como “Treinta y Un Mil..”, el código genera “Treinta y UNO Mil…”, igual con “Veintiuno mil, en vez de “Veinti un mil”, en fin, también le agregué el parámetro MONEDA para que incluye “PESOS” o “Dólares”, etc, y agregué un prefijo, porque aquí en México usamos un postfijo al final de las cantidades monetarias, ejemplo, “Cincuenta Mil Pesos 00/100 M.N.***”, siendo el postfijo “M.N.***”, espero a alguien pueda servirle el aporte, nuevamente GRACIAS al autor, ahora iré a jugar Fifa 11 en PS3!!, adjunto el código cambiado (espero alcance el espacio)

    private static string RellenarCadenaPorLaIzquierda(string cadena, char relleno, int tamanio)
    {
    string cadenaRellenada = cadena;
    while (cadenaRellenada.Length < tamanio)
    {
    cadenaRellenada = relleno + cadenaRellenada;
    }

    return cadenaRellenada;
    }

    public static string ConvertirDobleAMontoEnLetras(double cantidad, string moneda, string postfijoMontoEnLetras)
    {
    string res, dec = "";
    Int64 entero;
    int decimales;

    entero = Convert.ToInt64(Math.Truncate(cantidad));
    decimales = Convert.ToInt32(Math.Round((cantidad - entero) * 100, 2));

    dec = " CON " + RellenarCadenaPorLaIzquierda(decimales.ToString(), '0', 2) + "/100";

    res = ToText(Convert.ToDouble(entero)) + " " + moneda.ToUpper().Trim() + dec + " " + postfijoMontoEnLetras.ToUpper().Trim();
    return res;
    }

    private static string ToText(double value)
    {
    string Num2Text = "";

    value = Math.Truncate(value);
    if (value == 0) Num2Text = "CERO";
    else if (value == 1) Num2Text = "UNO";
    else if (value == 2) Num2Text = "DOS";
    else if (value == 3) Num2Text = "TRES";
    else if (value == 4) Num2Text = "CUATRO";
    else if (value == 5) Num2Text = "CINCO";
    else if (value == 6) Num2Text = "SEIS";
    else if (value == 7) Num2Text = "SIETE";
    else if (value == 8) Num2Text = "OCHO";
    else if (value == 9) Num2Text = "NUEVE";
    else if (value == 10) Num2Text = "DIEZ";
    else if (value == 11) Num2Text = "ONCE";
    else if (value == 12) Num2Text = "DOCE";
    else if (value == 13) Num2Text = "TRECE";
    else if (value == 14) Num2Text = "CATORCE";
    else if (value == 15) Num2Text = "QUINCE";
    else if (value < 20) Num2Text = "DIECI" + ToText(value - 10);
    else if (value == 20) Num2Text = "VEINTE";
    else if (value < 30)
    {
    string segundaCifra;
    if ((value % 20).Equals(1))
    {
    segundaCifra = "UN";
    }
    else
    {
    segundaCifra = ToText(value % 20);
    }
    Num2Text = "VEINTI" + segundaCifra;
    }
    else if (value == 30) Num2Text = "TREINTA";
    else if (value == 40) Num2Text = "CUARENTA";
    else if (value == 50) Num2Text = "CINCUENTA";
    else if (value == 60) Num2Text = "SESENTA";
    else if (value == 70) Num2Text = "SETENTA";
    else if (value == 80) Num2Text = "OCHENTA";
    else if (value == 90) Num2Text = "NOVENTA";

    else if (value < 100)
    {

    string segundaCifra;
    if ((value % 10).Equals(1))
    {
    segundaCifra = "UN";
    }
    else
    {
    segundaCifra = ToText(value % 10);
    }

    Num2Text = ToText(Math.Truncate(value / 10) * 10) + " Y " + segundaCifra;
    }
    else if (value == 100) Num2Text = "CIEN";
    else if (value < 200) Num2Text = "CIENTO " + ToText(value - 100);
    else if ((value == 200) || (value == 300) || (value == 400) || (value == 600) || (value == 800)) Num2Text = ToText(Math.Truncate(value / 100)) + "CIENTOS";
    else if (value == 500) Num2Text = "QUINIENTOS";
    else if (value == 700) Num2Text = "SETECIENTOS";
    else if (value == 900) Num2Text = "NOVECIENTOS";
    else if (value < 1000) Num2Text = ToText(Math.Truncate(value / 100) * 100) + " " + ToText(value % 100);
    else if (value == 1000) Num2Text = "MIL";
    else if (value < 2000) Num2Text = "MIL " + ToText(value % 1000);
    else if (value < 1000000)
    {
    Num2Text = ToText(Math.Truncate(value / 1000)) + " MIL";
    if ((value % 1000) > 0)
    {
    Num2Text = Num2Text + ” ” + ToText(value % 1000);
    }
    }

    else if (value == 1000000) Num2Text = “UN MILLON”;
    else if (value < 2000000) Num2Text = "UN MILLON " + ToText(value % 1000000);
    else if (value < 1000000000000)
    {
    Num2Text = ToText(Math.Truncate(value / 1000000)) + " MILLONES ";
    if ((value - Math.Truncate(value / 1000000) * 1000000) > 0)
    {
    Num2Text = Num2Text + ” ” + ToText(value – Math.Truncate(value / 1000000) * 1000000);
    }
    }

    else if (value == 1000000000000)
    {
    Num2Text = “UN BILLON”;
    }
    else if (value < 2000000000000)
    {
    Num2Text = "UN BILLON " + ToText(value - Math.Truncate(value / 1000000000000) * 1000000000000);
    }
    else
    {
    Num2Text = ToText(Math.Truncate(value / 1000000000000)) + " BILLONES";
    if ((value - Math.Truncate(value / 1000000000000) * 1000000000000) > 0)
    {
    Num2Text = Num2Text + ” ” + ToText(value – Math.Truncate(value / 1000000000000) * 1000000000000);
    }
    }

    return Num2Text;
    }

  11. Ese codigo esta demasiado largo mira este para ver si me puedes ayudar a mejorarlo

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

    namespace convertir
    {
    class Program
    {
    static void Main(string[] args)
    {
    string num;
    int m, c, d, r, n,s;
    do
    {
    System.Console.Clear();
    System.Console.WriteLine(“Escriba un numero entre 1 y 9999 :”);
    num = System.Console.ReadLine();
    n = int.Parse(num);
    }
    while (n < 1 || n > 9999);
    s = n / 100;
    r = n % 10; n = n / 10;
    d = n % 10; n = n / 10;
    c = n % 10; n= n / 10;
    m = n % 10;

    switch (m)
    {
    case 1:
    {
    System.Console.WriteLine(“\nMil”);
    break;
    }

    case 2:
    {
    System.Console.WriteLine(“\nDosmil”);
    break;
    }

    case 3:
    {
    System.Console.WriteLine(“\nTresmil”);
    break;
    }
    case 4:
    {
    System.Console.WriteLine(“\nCuatromil”);
    break;
    }

    case 5:
    {
    System.Console.WriteLine(“\nCincomil”);
    break;
    }

    case 6:
    {
    System.Console.WriteLine(“\nSeismil”);
    break;
    }

    case 7:
    {
    System.Console.WriteLine(“\nSietemil”);
    break;
    }

    case 8:
    {
    System.Console.WriteLine(“\nOchomil”);
    break;
    }

    case 9:
    {
    System.Console.WriteLine(“\nNuevemil”);
    break;
    }

    }
    switch (c)
    {
    case 1:
    {

    System.Console.WriteLine(“cien”);
    break;

    }

    case 2:
    {
    System.Console.WriteLine(“doscientos”);
    break;
    }

    case 3:
    {
    System.Console.WriteLine(“trecientos”);
    break;
    }

    case 4:
    {
    System.Console.WriteLine(“cuatrocientos”);
    break;
    }

    case 5:
    {
    System.Console.WriteLine(“quinientos”);
    break;
    }

    case 6:
    {
    System.Console.WriteLine(“seiscientos”);
    break;
    }

    case 7:
    {
    System.Console.WriteLine(“setecientos”);
    break;
    }

    case 8:
    {
    System.Console.WriteLine(“ochocientos”);
    break;
    }

    case 9:
    {
    System.Console.WriteLine(“novescientos”);
    break;
    }

    }
    switch (d)
    {
    case 1:
    {
    System.Console.WriteLine(“dies”);
    break;
    }

    case 2:
    {
    System.Console.WriteLine(“veinte”);
    break;
    }

    case 3:
    {
    System.Console.WriteLine(“treinta”);
    break;
    }

    case 4:
    {
    System.Console.WriteLine(“cuarenta”);
    break;
    }

    case 5:
    {
    System.Console.WriteLine(“cincuenta”);
    break;
    }

    case 6:
    {
    System.Console.WriteLine(“sesenta”);
    break;
    }

    case 7:
    {
    System.Console.WriteLine(“setenta”);
    break;
    }

    case 8:
    {
    System.Console.WriteLine(“ochenta”);
    break;
    }

    case 9:
    {
    System.Console.WriteLine(“noventa”);
    break;
    }
    }

    switch (r)
    {
    case 1:
    {
    System.Console.WriteLine(“uno”);
    break;
    }

    case 2:
    {
    System.Console.WriteLine(“dos”);
    break;
    }

    case 3:
    {
    System.Console.WriteLine(“tres”);
    break;
    }

    case 4:
    {
    System.Console.WriteLine(“cuatro”);
    break;
    }

    case 5:
    {
    System.Console.WriteLine(“cinco”);
    break;
    }

    case 6:
    {
    System.Console.WriteLine(“seis”);
    break;
    }

    case 7:
    {
    System.Console.WriteLine(“siete”);
    break;
    }

    case 8:
    {
    System.Console.WriteLine(“ocho”);
    break;
    }

    case 9:
    {
    System.Console.WriteLine(“nueve”);
    break;
    }
    }
    }

  12. Que tal Gerardo, me parece muy bien el cambio a los switch’s, voy a probar el código a ver cual es el comportamiento, por cierto, antes de llegar a este blog estuve buscando, algún algoritmo para poder resolver el problema, no encontré ninguno, sin embargo tu aproximación me pareció muy buena, sería buena idea preguntar si alguien en el blog sabe de algún algoritmo o procedimiento óptimo

  13. Y no se puede reducir con una matriz de estados apenas las estoy viendo y me dijeron que ayuda a no tener muchos if, solo pregunta.
    Gracias ta padre me salvaste un parcial :D

  14. Hola Gerardo me parece mas recursivo el codigo cuando se usa con case, ya que cuando usamos condicionales obligatoriamente el programa siempre estará preguntando mientras que con el case nos ayuda mucho el switch. Voy a probarlo. Saludos!!!

  15. Gracias, muy buen algoritmo, fácil de entender y simple !!!

    Siendo pilas se puede hacer trillones, cuatrillones, etc
    Lo máximo

  16. Hola a todos esta muy bueno tu codigo excelente diria yop. personas asi como ustedes aportando los conocimientos seriamos todos supero pero bueno esperemos no solo copy y paste pa los nuevos les pediria indagaran poco a poco la logica q se le aplica par q ellos en un futuro logren hacer mas aportaciones:) suerte

  17. Solo le hice unas pequeña modificacion a tu codigo usando un arreglo de strings para los numeros del uno al 15…

    string[] UNIDADES = { “CERO”, “UNO”, “DOS”, “TRES”, “CUATRO”, “CINCO”, “SEIS”, “SIETE”, “OCHO”, “NUEVE”, “DIEZ”, “ONCE”, “DOCE”, “TRECE”, “CATORCE”, “QUINCE”};

    value = Math.Truncate(value);

    if((value>=0) && (value<=15))
    Num2Text=UNIDADES[Convert.ToInt16(value)];

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>