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
Buen trabajo amigo, aunque se puede mejorar usando matrices y calculando el modulo.
ResponderEliminarNo 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
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
ResponderEliminarSolo tienes que sustituir el metodo to_text por el metodo NumeroALetras y funcionara a la primera.
ResponderEliminarhay un problema con la clase cuando quieres corvertir un numero exacto sin decimales por ejemplo 25, aparece "venticuatro con 100/100"
ResponderEliminarMuy bueno el post, me sirvio mucho Gracias!
ResponderEliminarexcelente aporte muchas gracias me sirvio bastante
ResponderEliminarhay un problema con la clase cuando quieres corvertir un numero exacto sin decimales por ejemplo 25, aparece "venticuatro con 100/100"...
ResponderEliminaroye estas mal a mi me funciono perfectamente que enfadoso eres
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
ResponderEliminarBuenas tardes, me podrían ayudar como visualizar el resultado:
ResponderEliminarEl 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
Gracias me sirvio mucho!!
ResponderEliminarElefante
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!!
Excelente clase, me sirvió de maravilla. Muchas gracias.
ResponderEliminarExcelente. Nada que criticar. Pues sirve perfecto para lo que esta diseñado, convertir numeros a letras.
ResponderEliminarPara 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.
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:
ResponderEliminarif (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!!!
En lugar de totext, qe otro puedo utilizar?
ResponderEliminarGRAN TRABAJO...!!
ResponderEliminarGracias; me ha servido..
Un saludo
Muchisimas gracias, esto me ha servido de gran ayuda....
ResponderEliminarJoder tio, que mierda de codigo has puesto jilipoyas
ResponderEliminarhola soy david como seria para una factura es decir que diga
ResponderEliminar21= veintiun pesos 00/100 m.n.
y asi sucesivamente....
Muy buen aporte, tiene sus detalles, solo es cuestión de copiarlo y afinarle unas cosas, gracias me sirvio mucho
ResponderEliminarya cambie el toText por NumeroALetras pero ahora me dice que no contiene ningun main estatico
ResponderEliminarGracias por el aporte ;)
ResponderEliminarAquí una librería gratuita que hace todo esto y mas!!! Here is a free library that does all this and more !!!
ResponderEliminarhttp://urysoft.blogspot.com.es/p/urysoftutilities.html?view=sidebar
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
ResponderEliminarmuy bueno!! me sirvió :3
ResponderEliminarEhhh... 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!!!
ResponderEliminarI would like you post the design page code!!! I'll be grateful if you could help me.
Thanks a lot!!!
se puede pasar ese programa a pseint ayuda por favor
ResponderEliminar