Num2LetrasUna serie de funciones para incluir en una clase .vb para que te permita convertir un valor numérico en palabras
Fecha: 09/Ago/2005 (07 Agosto 2005)
|
La otra vez necesité encontrar una función que me interpretara numeros en palabras, algo asi como que si yo escribiese en algun lugar "212" y en algun otro lugar dijera "Doscientos Doce", lo primero que hice fue buscar en el sitio msdn de microsoft, y la funcion que encontré no me servía porque era en inglés, y para quien mas o menos esté en el tema del ingles, sabrá que los valores de cientos por ejemplo es genérico (siempre son "hundred": one hundred, two hundred, etc.) mientras que en nuestro castellano los valores cambian (Cien o ciento... dependiendo, doscientos, trescientos, quinientos, etc.), luego me vine a buscar algo en el Guille que siempre me salva, y encontré una funcion pero para vb 6, y en algunos puntos tenía funciones incompatibles con vb.net (cuando usaba LSet por ejemplo), y debo reconocer que lo que yo sé de programación lo aprendí con .net, por tanto, me costó un chorro tratar de "traducir" algunas partes de vb 6 a vb.net, por lo que, decidí en función de lo que necesitaba, dejarme de buscar y ponerme a trabajar en el tema para poder lograr mi objetivo, y terminé haciéndo tres o cuatro funciones que interpretan el valor en palabras.
Quiero aclarar que la inspiración para obtener el producto final parte del artículo que encontré en el guille.info, de hecho, mi función principal lleva el mismo nombre "num2letras", y no quiero que malinterpreten esto como un plagio, sino que lo que pretendo es que si por ahi hay alguien que al igual que yo no domina mucho el tema de traducir de vb 6 para .net, pueda, con este articulo, tener el mismo resultado...A continuación sigue código en Visual Basic .NET:
Public Shared Function Num2Letras(ByVal valor As String) As String Dim VF As String 'El valor que voy a devolver al final Dim moneda As String = " Peso Chileno" Dim monedas As String = " Pesos Chilenos" valor = valor.Replace(".", String.Empty) valor = valor.Replace(",00", String.Empty) Select Case valor.Length Case 1 'Es una unidad Return ConvertirUnidad(valor, True) & moneda Case 2 'Posible decena Return ConvertirDecenas(valor) & monedas Case 3 'Centenas If valor = "100" Then Return "Cien" & monedas Exit Function End If Dim centena As String = valor.Substring(0, 1) Dim decena As String = valor.Substring(1, 1) Dim unidad As String = valor.Substring(2) If decena = "0" Then If unidad = "0" Then Return ConvertirCentenar(centena) & monedas Else unidad = ConvertirUnidad(unidad, True) Return ConvertirCentenar(centena) & " " & unidad & monedas End If Else If unidad = "0" Then decena = ConvertirDecenas(decena & unidad) Return ConvertirCentenar(centena) & " " & decena & monedas Else unidad = ConvertirUnidad(unidad, True) decena = ConvertirDecenas(decena & unidad) Return ConvertirCentenar(centena) & " " & decena & " " & unidad & monedas End If End If Case 4 'Millares If valor = "1000" Then Return "Mil" & monedas Exit Function End If Dim millar As String = valor.Substring(0, 1) If millar = "1" Then millar = "Mil " Else millar = ConvertirUnidad(millar) & "Mil" End If Dim centena As String = valor.Substring(1, 1) Dim decena As String = valor.Substring(2, 1) Dim unidad As String = valor.Substring(3) If decena = "0" Then If unidad = "0" Then Return millar & ConvertirCentenar(centena) & monedas Else unidad = ConvertirUnidad(unidad, True) Return millar & ConvertirCentenar(centena) & " " & unidad & monedas End If Else If unidad = "0" Then decena = ConvertirDecenas(decena & unidad) Return millar & ConvertirCentenar(centena) & " " & decena & monedas Else unidad = ConvertirUnidad(unidad, True) decena = ConvertirDecenas(decena & unidad) Return millar & ConvertirCentenar(centena) & " " & decena & " " & unidad & monedas End If End If Case 5 'Decenas de millares If valor = "10000" Then Return "Diez Mil" & monedas Exit Function End If Dim millar As String = valor.Substring(0, 2) millar = ConvertirDecenas(millar) & "Mil" Dim centena As String = valor.Substring(2, 1) Dim decena As String = valor.Substring(3, 1) Dim unidad As String = valor.Substring(4) If decena = "0" Then If unidad = "0" Then Return millar & ConvertirCentenar(centena) & monedas Else unidad = ConvertirUnidad(unidad, True) Return millar & ConvertirCentenar(centena) & " " & unidad & monedas End If Else If unidad = "0" Then decena = ConvertirDecenas(decena & unidad) Return millar & ConvertirCentenar(centena) & " " & decena & monedas Else unidad = ConvertirUnidad(unidad, True) decena = ConvertirDecenas(decena & unidad) Return millar & ConvertirCentenar(centena) & " " & decena & " " & unidad & monedas End If End If Case 6 'Centenas de millares If valor = "100000" Then Return "Cien Mil" & monedas Exit Function End If Dim millar As String = valor.Substring(0, 3) Dim mCentena, mDecena, mUnidad As String Dim mCentenac, mDecenac, mUnidadc As String If millar = "100" Then millar = "Cien Mil" Else mCentena = millar.Substring(0, 1) mDecena = millar.Substring(1, 1) mUnidad = millar.Substring(2) If mDecena = "0" Then If mUnidad = "0" Then millar = ConvertirCentenar(mCentena) & " Mil" Else mUnidadc = ConvertirUnidad(mUnidad, True) millar = ConvertirCentenar(mCentena) & " " & mUnidadc & " Mil" End If Else 'If mUnidad = "0" Then ' mDecenac = ConvertirDecenas(mDecena & mUnidad) ' millar = ConvertirCentenar(mCentena) & " " & mDecenac & " Mil" 'Else mDecenac = ConvertirDecenas(mDecena & mUnidad) millar = ConvertirCentenar(mCentena) & " " & mDecenac & " Mil" 'End If End If End If Dim centena As String = valor.Substring(3, 1) Dim decena As String = valor.Substring(4, 1) Dim unidad As String = valor.Substring(5) Dim Centenac, Decenac, Unidadc As String If decena = "0" Then If unidad = "0" Then Return millar & ConvertirCentenar(centena) & monedas Else Unidadc = ConvertirUnidad(unidad, True) Return millar & ConvertirCentenar(centena) & " " & Unidadc & monedas End If Else If unidad = "0" Then Decenac = ConvertirDecenas(decena & unidad) Return millar & ConvertirCentenar(centena) & " " & Decenac & monedas Else Unidadc = ConvertirUnidad(unidad, True) Decenac = ConvertirDecenas(decena & unidad) Return millar & ConvertirCentenar(centena) & " " & Decenac & " " & Unidadc & monedas End If End If Case 7 'Milloncejo pero no quise continuarlo... Case 8 'Decenas de milloncejos pero ya estaba cansado... Case 9 'Centenas de milloncejos y me fui a acostar... End Select End Function Shared Function ConvertirDecenas(ByVal valor As String) As String Dim decena, unidad As String decena = valor.Substring(0, 1) unidad = valor.Substring(1) If unidad = 0 Then Select Case decena Case "1" Return "Diez" Case "2" Return "Veinte" Case "3" Return "Treinta" Case "4" Return "Cuarenta" Case "5" Return "Cincuenta" Case "6" Return "Sesenta" Case "7" Return "Setenta" Case "8" Return "Ochenta" Case "9" Return "Noventa" End Select Else Select Case decena Case "1" 'Dieces Select Case unidad Case "1" Return "Once" Case "2" Return "Doce" Case "3" Return "Trece" Case "4" Return "Catorce" Case "5" Return "Quince" Case "6" Return "Dieciseis" Case "7" Return "Diecisiete" Case "8" Return "Dieciocho" Case "9" Return "Diecinueve" End Select Case "2" 'Veintes Return "Veinti" & ConvertirUnidad(unidad, True) Case "3" Return "Treinta y " & ConvertirUnidad(unidad, True) Case "4" Return "Cuarenta y " & ConvertirUnidad(unidad, True) Case "5" Return "Cincuenta y " & ConvertirUnidad(unidad, True) Case "6" Return "Sesenta y " & ConvertirUnidad(unidad, True) Case "7" Return "Setenta y " & ConvertirUnidad(unidad, True) Case "8" Return "Ochenta y " & ConvertirUnidad(unidad, True) Case "9" Return "Noventa y " & ConvertirUnidad(unidad, True) End Select End If End Function Shared Function ConvertirUnidad(ByVal Unidad As String, Optional ByVal un As Boolean = False) As String If un = True Then If Unidad = "1" Then Return "Un" End If Else If Unidad = "1" Then Return "Uno" End If End If Select Case Unidad Case "2" Return "Dos" Case "3" Return "Tres" Case "4" Return "Cuatro" Case "5" Return "Cinco" Case "6" Return "Seis" Case "7" Return "Siete" Case "8" Return "Ocho" Case "9" Return "Nueve" End Select End Function Shared Function ConvertirCentenar(ByVal Valor As String) As String Select Case Valor Case "1" Return "Ciento" Case "2" Return "Doscientos" Case "3" Return "Trescientos" Case "4" Return "Cuatrocientos" Case "5" Return "Quinientos" Case "6" Return "Seiscientos" Case "7" Return "Setecientos" Case "8" Return "Ochocientos" Case "9" Return "Novecientos" Case "0" Return "" End Select End Function
Importante: este codigo, asi como está, me funcionó para mis propósitos, como dije al principio, soy nuevo programando y comenzé con .net, estoy seguro que por ahí quizás alguien con mas experiencia que yo lo encuentre y se dé cuenta de que hay mucho codigo ocioso, si asi sucede y anda con ganas de mejorarlo, le agradecería que me hiciera llegar alguna copia para modificar tambien la clase en donde tengo el codigo...
Al final, supongamos que en el label llamado lblMonto tenemos el valor numerico, y en el label llamado lblDescripcion queremos poner el valor descripto que aparece en lblMonto, solo hay que hacer lo siguiente:
lblDescripcion.Text = [NombreDeLaClase].Num2Letras(lblMonto.Text)Y voilá!!!! tenemos el precio que necesitábamos, descripto en palabras :)...
Bueno, lo que dije, que espero que a alguien le sirva de algo, y si otro alguien mas experimentado que yo aparece y lo mejora, me gustaría poder recibir alguna copia del codigo para actualizarlo en mi aplicacion tambien, muchas gracias por el espacio, y que estén bien!!!!