miércoles, 16 de abril de 2008

C# - Convertir números a letras

Esta debe ser una de las funciones más solicitadas por los desarrolladores, consiste en convertir un número dado a letras. Esta función recibe el número como parámetro, hagan un ToString() antes, porque lo recibe como string, y devuelve el resultado en letras.

Modifiqué el método y lo hice estático para no tener que instanciar un objeto para su uso.

Ejemplos de retornos:
8794 --> "OCHO MIL SETECIENTOS NOVENTA Y CUATRO"
97494131 --> "NOVENTA Y SIETE MILLONES CUATROCIENTOS NOVENTA Y CUATRO MIL CIENTO TREINTA Y UNO"
59843.4 --> "CINCUENTA Y NUEVE MIL OCHOCIENTOS CUARENTA Y TRES CON 40/100"

La clase:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Utilidades 
{
   public class Conversiones
   {
       public static string NumeroALetras(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 = Utilidades.Conversiones.NumeroALetras(Convert.ToDouble(entero)) + dec;
           return res;
       }
 
       private static string NumeroALetras(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;
       }
   }
}

Fuente: msmvps.com

26 comentarios:

  1. Buen trabajo amigo, aunque se puede mejorar usando matrices y calculando el modulo.

    No entiendo esto:

    59843.4 -> "CINCUENTA Y NUEVE MIL OCHOCIENTOS CUARENTA Y TRES CON 40/100"

    No sería :
    59843.4 -> "CINCUENTA Y NUEVE MIL OCHOCIENTOS CUARENTA Y TRES CON CUATRO

    ResponderEliminar
  2. Amigo copie tu codigo y cuando quiero compilarlo sale que no me reconoce toText, tengo que hacer algo adicional o es que te falgo agregar ese procedimiento

    ResponderEliminar
  3. Solo tienes que sustituir el metodo to_text por el metodo NumeroALetras y funcionara a la primera.

    ResponderEliminar
  4. hay un problema con la clase cuando quieres corvertir un numero exacto sin decimales por ejemplo 25, aparece "venticuatro con 100/100"

    ResponderEliminar
  5. Muy bueno el post, me sirvio mucho Gracias!

    ResponderEliminar
  6. excelente aporte muchas gracias me sirvio bastante

    ResponderEliminar
  7. hay un problema con la clase cuando quieres corvertir un numero exacto sin decimales por ejemplo 25, aparece "venticuatro con 100/100"...


    oye estas mal a mi me funciono perfectamente que enfadoso eres

    ResponderEliminar
  8. buenas agradeceria m ayuden. el problema q tengo s q al momento de inscrustarlo en el programa no m coge, le puse 2 textbox, 3 button, agradeceria m ayudes mi msn dj_johan_love@hotmail.com

    ResponderEliminar
  9. Buenas tardes, me podrían ayudar como visualizar el resultado:

    El código va en una clase,pero como le hago para llamarlo desde mi código principal para visualizar el resultado en la interfaz gráfica, ya que es la primera vez que trabajo con clases y C#.

    Gracias

    ResponderEliminar
  10. Gracias me sirvio mucho!!

    Elefante
    lo puedes poner algo asi:

    TextBox, Label, o lo que sea.Text = Utilidades.Conversiones.NumeroALetras(Numero que quieres convertir en letra);

    y con eso te devuelve el valor en letra
    espero que te sirva de ayuda

    Saludos!!

    ResponderEliminar
  11. Excelente clase, me sirvió de maravilla. Muchas gracias.

    ResponderEliminar
  12. Excelente. Nada que criticar. Pues sirve perfecto para lo que esta diseñado, convertir numeros a letras.
    Para los que no les funciona, se les puede ayudar pero expliquen mejor sus dudas.
    Y para los criticos, si no les funciona desarroyen algo personalizado en ves de estar criticando algo que esta bien echo.

    ResponderEliminar
  13. SI ES SIERTO CUANDO QUIERES CONVERTIR UNA CANTIDAD CON DECIMALES TE A PARECE TODA LA CIFRA BIEN PERO EN LOS DECIMASLES NO SALE ALGO ASI 77/100 BUENO YO MODIFIQUE ESE PEDAZO DE LA CLASE PARA QUE FUNCIONACE A SI: CON SETENTA Y SIETE CENTAVOS LO UNICO QUE HAY QUE HACER ES CANVIEAR ESTE PEDAZO DE LA CLASE:

    if (decimales > 0)

    {

    dec = " CON " + decimales.ToString() + "/100";

    }

    POR ESTE:

    if (decimales > 0)

    {

    dec = " CON " +Utilidades.Conversiones.NumeroALetras(decimales.ToString()) + " CENTAVOS";

    }

    ES CASI AL COMIENZO DE LA CLASE DONDE SE ENCUETRA ESTA PARTE Y LA VERDAD LA CLASE ESTA MUY BUENA MUCHAS GRASIAS!!!

    ResponderEliminar
  14. En lugar de totext, qe otro puedo utilizar?

    ResponderEliminar
  15. GRAN TRABAJO...!!
    Gracias; me ha servido..
    Un saludo

    ResponderEliminar
  16. Muchisimas gracias, esto me ha servido de gran ayuda....

    ResponderEliminar
  17. Joder tio, que mierda de codigo has puesto jilipoyas

    ResponderEliminar
  18. hola soy david como seria para una factura es decir que diga
    21= veintiun pesos 00/100 m.n.
    y asi sucesivamente....

    ResponderEliminar
  19. Muy buen aporte, tiene sus detalles, solo es cuestión de copiarlo y afinarle unas cosas, gracias me sirvio mucho

    ResponderEliminar
  20. ya cambie el toText por NumeroALetras pero ahora me dice que no contiene ningun main estatico

    ResponderEliminar
  21. Gracias por el aporte ;)

    ResponderEliminar
  22. 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
  23. Hola revisando tu codigo observo que estas conversiones las esta haciendo mal, pero no encuentro como corregirla. 101001 = CIENTO UNO MIL UNO, la idea es que muestre ciento un mil uno. te agradezco si me pueden colaborar

    ResponderEliminar
  24. muy bueno!! me sirvió :3

    ResponderEliminar
  25. Ehhh... I think it's a really good post, I took an advantage of it, but I really don't know so much about programming, I'm noob, what a shame!!!
    I would like you post the design page code!!! I'll be grateful if you could help me.
    Thanks a lot!!!

    ResponderEliminar
  26. se puede pasar ese programa a pseint ayuda por favor

    ResponderEliminar