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

22 comentarios:

Anónimo dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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

Dalila dijo...

Muy bueno el post, me sirvio mucho Gracias!

Anónimo dijo...

excelente aporte muchas gracias me sirvio bastante

Anónimo dijo...

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

Anónimo dijo...

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

Elefante dijo...

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

Sergio dijo...

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!!

Anónimo dijo...

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

Anónimo dijo...

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.

Anónimo dijo...

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!!!

Anónimo dijo...

En lugar de totext, qe otro puedo utilizar?

Daniel Funes dijo...

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

Anónimo dijo...

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

Anónimo dijo...

Joder tio, que mierda de codigo has puesto jilipoyas

DAVID ALFONSO dijo...

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

Anónimo dijo...

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

Ivan dijo...

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

José de Jesús Santiago Sánchez dijo...

Gracias por el aporte ;)

CEO at UrySoft dijo...

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


Artículos relacionados