Num2Letras

Una 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)
Autor: Henry Rodriguez: jjmagro@gmail.com

 


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


ir al índice