Cuando se realizan trabajos donde se necesita mostrar al cliente un determinado monto de dinero, tipo factura, recibo, cheque, etc, el cliente desea ver el monto en numeral asi como en literal.
Por ejemplo:
Pues bien, la siguiente clase a la que llame NumLetra.cs realiza justamente esa operacion, esta extracomentada y trate de hacerla lo mas entendible posible. El proyecto en C#, lo llame con_NumLetraC
La logica que se utliza es la siguiente:
La clase recibe un numero ej. 123456789,50
valida este numero, si el numero no es valido devuelve NULL
Si el numero es valido segun sea este unidad, decena, centena, mil o millon, va clasificando el numero y llama a sus procedimientos correspondientes, estas funciones, son utilizadas en cascada, osea:
nuestro numero de ejemplo es 123456789,50, entonces separa en 123456789 y 50, siendo 50 nuestra parte decimal.La logica que se utliza es la siguiente:
La clase recibe un numero ej. 123456789,50
valida este numero, si el numero no es valido devuelve NULL
Si el numero es valido segun sea este unidad, decena, centena, mil o millon, va clasificando el numero y llama a sus procedimientos correspondientes, estas funciones, son utilizadas en cascada, osea:
El numero entero, 123456789 es clasificado = es millon, entonces llama a la funcion getMillones, esta funcion a la vez divide el numero en miles y millones
123456789 = 123 456789 donde 123 corresponde a millones y 456789 a miles
entonces la misma funcion llama a las funciones getMiles, getCentenas, getUnidades, segun corresponda, al igual que la funcion getMiles, hace uso de getCentenas, getDecenas getUnidades, lo mismo getCentenas, hace uso de getDececas, getUnidades.
123456789 = 123 456789 donde 123 corresponde a millones y 456789 a miles
entonces la misma funcion llama a las funciones getMiles, getCentenas, getUnidades, segun corresponda, al igual que la funcion getMiles, hace uso de getCentenas, getDecenas getUnidades, lo mismo getCentenas, hace uso de getDececas, getUnidades.
Espero se entienda :)
Imports System.Text.RegularExpressions Public Class NumLetra Dim UNIDADES As String() = {"", "un ", "dos ", "tres ", "cuatro ", "cinco ", "seis ", "siete ", "ocho ", "nueve "} Dim DECENAS As String() = {"diez ", "once ", "doce ", "trece ", "catorce ", "quince ", "dieciseis ", "diecisiete ", "dieciocho ", "diecinueve", "veinte ", "treinta ", "cuarenta ", "cincuenta ", "sesenta ", "setenta ", "ochenta ", "noventa "} Dim CENTENAS As String() = {"", "ciento ", "doscientos ", "trecientos ", "cuatrocientos ", "quinientos ", "seiscientos ", "setecientos ", "ochocientos ", "novecientos "} Dim r As Regex Sub NumLetra() End Sub Public Function Convertir(ByVal numero As String, ByVal mayusculas As Boolean) As String Dim literal As String = "" Dim parte_decimal As String = "" 'si el numero utiliza (.) en lugar de (,) -> se reemplaza numero = Replace(numero, ".", ",") 'si el numero no tiene parte decimal, se le agrega ,00 If numero.IndexOf(",") = -1 Then numero = numero & ",00" End If 'se valida formato de entrada -> 0,00 y 999 999 999,00 'if (Pattern.matches("\\d{1,9},\\d{1,2}", numero)) { r = New Regex("\d{1,9},\d{1,2}") Dim mc As MatchCollection = r.Matches(numero) If mc.Count > 0 Then 'se divide el numero 0000000,00 -> entero y decimal Dim Num As String() = numero.Split(",") 'de da formato al numero decimal parte_decimal = Num(1) & "/100 Bolivianos." 'se convierte el numero a literal If Num(0) = 0 Then literal = "cero " ElseIf Num(0) > 999999 Then literal = getMillones(Num(0)) ElseIf Num(0) > 999 Then literal = getMiles(Num(0)) ElseIf Num(0) > 99 Then literal = getCentenas(Num(0)) ElseIf Num(0) > 9 Then literal = getDecenas(Num(0)) Else literal = getUnidades(Num(0)) End If 'devuelve el resultado en mayusculas o minusculas If mayusculas Then Return (literal & parte_decimal).ToUpper Else Return literal & parte_decimal End If Else Return "" End If End Function ' funciones para convertir los numeros a literales Private Function getUnidades(ByVal numero As String) As String '1 - 9 'si tuviera algun 0 antes se lo quita -> 09 = 9 o 009=9 Dim num As String = numero.Substring(numero.Length - 1) Return UNIDADES(num) End Function Private Function getDecenas(ByVal numero As String) As String '99 If numero < 10 Then 'para casos como -> 01 - 09 Return getUnidades(numero) ElseIf numero > 19 Then 'para 20...99 Dim u As String = getUnidades(numero) If u.Equals("") Then 'para 20,30,40,50,60,70,80,90 Return DECENAS(numero.Substring(0, 1) + 8) Else Return DECENAS(numero.Substring(0, 1) + 8) & "y " & u End If Else Return DECENAS(numero - 10) End If End Function Private Function getCentenas(ByVal numero As String) As String If numero > 99 Then 'es centena If numero = 100 Then 'caso especial Return "cien " Else Return CENTENAS(numero.Substring(0, 1)) & getDecenas(numero.Substring(1)) End If Else 'se quita el 0 antes de convertir a decenas Return getDecenas(numero) End If End Function Private Function getMiles(ByVal numero As String) As String 'obtiene las centenas' Dim c As String = numero.Substring(numero.Length - 3) 'obtiene los miles Dim m As String = numero.Substring(0, numero.Length - 3) Dim n As String = "" 'se comprueba que miles tenga valor entero If m > 0 Then n = getCentenas(m) Return n & " mil " & getCentenas(c) Else Return "" & getCentenas(c) End If End Function Private Function getMillones(ByVal numero As String) As String 'se obtiene los miles Dim miles As String = numero.Substring(numero.Length - 6) 'millones Dim millon As String = numero.Substring(0, numero.Length - 6) Dim n As String = "" If millon > 9 Then n = getCentenas(millon) & " millones " Else n = getUnidades(millon) & " millon " End If Return n & getMiles(miles) End Function End Class
Esta clase, recibe un numero de 0,00 a 999999999.00 en formato String, el separador decimal puede ser un punto (.) o una coma (,), ademas tiene un parametro booleano "mayusculas" el cual sea verdadero (true) o falso (false), retorna el resultado en mayusculas o minusculas, esta clase no acepta numeros negativos ni tampoco numero mayores o iguales a mil millones, aunque claro trate de escribir esta clase para que sea facilmente comprensible y asi pueda ser ampliado o modificado segun sus necesidades.
La forma de llamara a esta clase es:
Module Module1 Sub Main() Dim NL As New NumLetra Dim a As String a = NL.Convertir("123456789,50", False) Console.WriteLine(a) a = NL.Convertir("4524011.50", False) Console.WriteLine(">" & a) a = NL.Convertir("999999999,50", False) Console.WriteLine(">" & a) a = NL.Convertir("001000925,50", False) Console.WriteLine(">" & a) a = NL.Convertir("0,50", True) Console.WriteLine(">" & a) a = NL.Convertir("7,50", False) Console.WriteLine(">" & a) a = NL.Convertir("69,50", True) Console.WriteLine(">" & a) a = NL.Convertir("6969,50", False) Console.WriteLine(">" & a) Console.ReadKey() End Sub End Module
Y al ejecutar el proyecto tenemos:
Puedes ver el proyecto original en java, desde aqui
4 comentarios:
wow Graciassss funciono excelente
gracias esto me fui muy util,
El programa es muy bueno pero tiene un error, cuando locas números con un 0 en la centena, ejemplo 1024. para solucionarlo solo deben quitar el cero antes de manda a las decenas como lo menciona, pero no lo hace. pueden escribir " numero = Strings.Right(numero, 2) 'se quita el 0 antes de convertir a decenas"
Saludos. Ariel Calderon
En este video aprendí como hacerlo, en la descripcion se puede descargar el proyecto , por si gustan checkearlo.
link: https://www.youtube.com/watch?v=GThaZPLJq_k&t=17s este link es en C#, si lo desean en Vb.net el link sería el siguiente: https://www.youtube.com/watch?v=HUXNFe0LkG8
Publicar un comentario