Añadir divisas en códigos elaborados con el programa informático Visual Basic

Quisiera saber si me pueden responder esta pregunta. Tengo este código para convertir una cantidad numérica a letra, lo que hace es si se escribe 1200 el programa escribe (mil doscientos) pero lo que quiero saber es si se puede hacer que no solo ponga (mil doscientos) sino que ponga (mil doscientos pesos).

1 respuesta

Respuesta
Espero no interpretarte mal, pero lo que me parece que necesitas es en realidad DEMASIADO simple:
Dada la supuesta función de conversión...
Function NumerosAletras(numero as currency) as string
Dim NumeroTraducido as string
NumeroTraducido = format(numero, "0000000.00")
'Procesamos el reconocimiento del numero convertido a cadena de caracteres, y lo traducimos a la expresión verbal del mismo, o sea en letras...
NumerosAletras = NumeroTraducido & " Pesos"
End Function
Eso es todo lo que necesitas: Simplemente antes de abandonar la función (o en el retorno de la misma) agregas la cadena " Pesos", y LISTO.
Espero haberte sido útil, y si no, intenta expresar la pregunta de otra manera, digo, por si no te interpreté correctamente.
¿Este código que me diste en que parte de debe meter? ¿En el botón o en el cuadro de texto? Porque el código que yo tenia era este:
Private Sub Command1_Click()
Me.Caption = Num2Text(Text1.Text)
End Sub
Public Function Num2Text(ByVal value As Double) As String
    Select Case value
        Case 0: Num2Text = "CERO"
        Case 1: Num2Text = "UN"
        Case 2: Num2Text = "DOS"
        Case 3: Num2Text = "TRES"
        Case 4: Num2Text = "CUATRO"
        Case 5: Num2Text = "CINCO"
        Case 6: Num2Text = "SEIS"
        Case 7: Num2Text = "SIETE"
        Case 8: Num2Text = "OCHO"
        Case 9: Num2Text = "NUEVE"
        Case 10: Num2Text = "DIEZ"
        Case 11: Num2Text = "ONCE"
        Case 12: Num2Text = "DOCE"
        Case 13: Num2Text = "TRECE"
        Case 14: Num2Text = "CATORCE"
        Case 15: Num2Text = "QUINCE"
        Case Is < 20: Num2Text = "DIECI" & Num2Text(value - 10)
        Case 20: Num2Text = "VEINTE"
        Case Is < 30: Num2Text = "VEINTI" & Num2Text(value - 20)
        Case 30: Num2Text = "TREINTA"
        Case 40: Num2Text = "CUARENTA"
        Case 50: Num2Text = "CINCUENTA"
        Case 60: Num2Text = "SESENTA"
        Case 70: Num2Text = "SETENTA"
        Case 80: Num2Text = "OCHENTA"
        Case 90: Num2Text = "NOVENTA"
        Case Is < 100: Num2Text = Num2Text(Int(value \ 10) * 10) & " Y " & Num2Text(value Mod 10)
        Case 100: Num2Text = "CIEN"
        Case Is < 200: Num2Text = "CIENTO " & Num2Text(value - 100)
        Case 200, 300, 400, 600, 800: Num2Text = Num2Text(Int(value \ 100)) & "CIENTOS"
        Case 500: Num2Text = "QUINIENTOS"
        Case 700: Num2Text = "SETECIENTOS"
        Case 900: Num2Text = "NOVECIENTOS"
        Case Is < 1000: Num2Text = Num2Text(Int(value \ 100) * 100) & " " & Num2Text(value Mod 100)
        Case 1000: Num2Text = "MIL"
        Case Is < 2000: Num2Text = "MIL " & Num2Text(value Mod 1000)
        Case Is < 1000000: Num2Text = Num2Text(Int(value \ 1000)) & " MIL"
            If value Mod 1000 Then Num2Text = Num2Text & " " & Num2Text(value Mod 1000)
        Case 1000000: Num2Text = "UN MILLON"
        Case Is < 2000000: Num2Text = "UN MILLON " & Num2Text(value Mod 1000000)
        Case Is < 1000000000000#: Num2Text = Num2Text(Int(value / 1000000)) & " MILLONES "
            If (value - Int(value / 1000000) * 1000000) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000) * 1000000)
        Case 1000000000000#: Num2Text = "UN BILLON"
        Case Is < 2000000000000#: Num2Text = "UN BILLON " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
        Case Else: Num2Text = Num2Text(Int(value / 1000000000000#)) & " BILLONES"
            If (value - Int(value / 1000000000000#) * 1000000000000#) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
    End Select
End Function
Repitiendo los mismos nombres de variables que utilizas, y justo antes de abandonar la función, es decir ANTES DE "End Function", debes escribir:
Num2Text = Num2Text & " Pesos"
Eso es todo. No necesitas más.
Oye que crees, hice eso que me dijiste pero quedo mal, si escribo 150 sale así (Ciento cincuenta pesos pesos). ¿Cuál seria el problema?
Es imposible que eso te suceda por problemas dentro de la función. Es decir, no veo otra mención de la palabra "pesos" DENTRO de la función. In other words: El problema está en el retorno del valor dentro de la parte principal de tu código que invoca a "Num2Text".
Haz la prueba cambiando DENTRO de la función a [Num2Text = Num2Text & " Pesos"] por [Num2Text = Num2Text & " Yenes"]...
... y verás que el resultado será algo así como "Ciento cincuenta yenes pesos", confirmando mi teoría que el segundo "pesos" está FUERA del código de la función que me muestras: Allí es donde debes quitarlo, FUERA de la función.
Avísame si lo solucionas. Estaré encantado de seguir guiándote.
Oye muchas gracias por tu ayuda, pero que crees que ya probé todo lo que me dijiste y en el caso de cambiar pesos a yenes sale lo mismo que antes pero ahora con (yenes yenes). Espero que me puedas ayudar. Te dejo el código para que lo revises.
Gracias
Private Sub Command1_Click()
Me.Caption = Num2Text(Text1.Text)
End Sub
Public Function Num2Text(ByVal value As Double) As String
    Select Case value
        Case 0: Num2Text = "CERO"
        Case 1: Num2Text = "UN"
        Case 2: Num2Text = "DOS"
        Case 3: Num2Text = "TRES"
        Case 4: Num2Text = "CUATRO"
        Case 5: Num2Text = "CINCO"
        Case 6: Num2Text = "SEIS"
        Case 7: Num2Text = "SIETE"
        Case 8: Num2Text = "OCHO"
        Case 9: Num2Text = "NUEVE"
        Case 10: Num2Text = "DIEZ"
        Case 11: Num2Text = "ONCE"
        Case 12: Num2Text = "DOCE"
        Case 13: Num2Text = "TRECE"
        Case 14: Num2Text = "CATORCE"
        Case 15: Num2Text = "QUINCE"
        Case Is < 20: Num2Text = "DIECI" & Num2Text(value - 10)
        Case 20: Num2Text = "VEINTE"
        Case Is < 30: Num2Text = "VEINTI" & Num2Text(value - 20)
        Case 30: Num2Text = "TREINTA"
        Case 40: Num2Text = "CUARENTA"
        Case 50: Num2Text = "CINCUENTA"
        Case 60: Num2Text = "SESENTA"
        Case 70: Num2Text = "SETENTA"
        Case 80: Num2Text = "OCHENTA"
        Case 90: Num2Text = "NOVENTA"
        Case Is < 100: Num2Text = Num2Text(Int(value \ 10) * 10) & " Y " & Num2Text(value Mod 10)
        Case 100: Num2Text = "CIEN"
        Case Is < 200: Num2Text = "CIENTO " & Num2Text(value - 100)
        Case 200, 300, 400, 600, 800: Num2Text = Num2Text(Int(value \ 100)) & "CIENTOS"
        Case 500: Num2Text = "QUINIENTOS"
        Case 700: Num2Text = "SETECIENTOS"
        Case 900: Num2Text = "NOVECIENTOS"
        Case Is < 1000: Num2Text = Num2Text(Int(value \ 100) * 100) & " " & Num2Text(value Mod 100)
        Case 1000: Num2Text = "MIL"
        Case Is < 2000: Num2Text = "MIL " & Num2Text(value Mod 1000)
        Case Is < 1000000: Num2Text = Num2Text(Int(value \ 1000)) & " MIL"
            If value Mod 1000 Then Num2Text = Num2Text & " " & Num2Text(value Mod 1000)
        Case 1000000: Num2Text = "UN MILLON"
        Case Is < 2000000: Num2Text = "UN MILLON " & Num2Text(value Mod 1000000)
        Case Is < 1000000000000#: Num2Text = Num2Text(Int(value / 1000000)) & " MILLONES "
            If (value - Int(value / 1000000) * 1000000) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000) * 1000000)
        Case 1000000000000#: Num2Text = "UN BILLON"
        Case Is < 2000000000000#: Num2Text = "UN BILLON " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
        Case Else: Num2Text = Num2Text(Int(value / 1000000000000#)) & " BILLONES"
            If (value - Int(value / 1000000000000#) * 1000000000000#) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
        End Select
        If Text1.Text = 1 Then
        Num2Text = Num2Text & " Yen"
        Else
        Num2Text = Num2Text & " Yenes"
        End If
    End Function
Ok, copié tu código a un nuevo proyecto temporal en VB 6, y efectivamente, pude reproducir tu error, que no es tal, sino más bien que se repite la palabra en cuestión (Yenes, Pesos) más de una vez.
¿Por qué NO es un error? Porque esto es en realidad una consecuencia de la RECURSIVIDAD, o sea, la capacidad de una función de llamarse a sí misma. Así es, en tu código convenientemente descompones el número analizado en porciones identificables de dos o tres dígitos, y entonces VUELVES a llamar a la misma función mientras todavía permaneces en ella, y esto hasta completar de analizar el número.
Para ejemplo, fíjate que pasa cuando analizas el número 150.000.000, o sea CIENTO CINCUENTA MILLONES... el resultado es: "CIENTO CINCUENTA Yenes Yenes MILLONES Yenes".
Por lo tanto, CADA VEZ que se llama la función a sí misma, entonces TAMBIÉN CADA VEZ agrega la cadena "Yenes", o "Pesos", o lo que fuera.
En estos momentos estoy trabajando en una versión de tu función que pueda sortear este "inconveniente" de la recursividad que NO ES tal, sino más bien una correcta utilización del código.
Para que te vayas entreteniendo y riéndote un poco, nota ahora el análisis del número 150.928.365:
"CIENTO CINCUENTA Yenes Yenes MILLONES NOVECIENTOS Yenes VEINTIOCHO Yenes Yenes Yenes MIL TRES YenesCIENTOS Yenes SESENTA Yenes Y CINCO Yenes Yenes Yenes Yenes Yenes."
¡JA, JA! Aguanta, que en unos pocos minutos tengo lista tu solución...
Aquí va la solución al problema de la RECURSIVIDAD en tu función:
1) En la sección Declaraciones de tu formulario, coloca el siguiente código, "Dim FlagRecur As Boolean". De esta manera "FlagRecur" estará VISIBLE a todas las subrutinas y funciones.
(NOTA: Recuerda, sin embargo, que si esta función "Num2Text" debería estar disponible dentro de TODO un proyecto, entonces, la función y la declaración de "FlagRecur" deberían colocarse más bien dentro de un módulo, no un formulario. Y la declaración de "FlagRecur" debería ser: "Global FlagRecur as Boolean". Así, la función "Num2Text" podrá invocarse desde CUALQUIER formulario y módulo.)
2) Sigamos trabajando sobre el supuesto que solo lo quieres sobre un único formulario...
En el evento "Form_Load" del formulario, coloca el código:
Private Sub Form_Load()
   FlagRecur = False
End Sub
Esto es, una vez que declaraste la variable booleana "FlagRecur", ahora es conveniente inicializarla como FALSA.
3) Ya dentro de la función "Num2Text", la corrección hay que hacerla sobre el final, incluyendo la porcioncita donde agregas la palabra "Yenes"...
        If FlagRecur = False Then
            If Text1.Text = 1 Then
                Num2Text = Num2Text & " Yen"
            Else
                Num2Text = Num2Text & " Yenes"
            End If
        End If
        FlagRecur = True
        If Right(Num2Text, 5) <> "Yenes" Then
            posic = InStr(Num2Text, "Yenes")
            If posic > 0 Then
               Num2Text = Left(Num2Text, posic - 1) & Right(Num2Text, Len(Num2Text) - (posic + 5))
               Num2Text = Num2Text & " Yenes"
            End If
        End If
    End Function
Tratemos de explicarla: La primera vez que se ejecuta, como "FlagRecur" está en FALSE, entonces agrega "Yenes", y se ACTIVA "FlagRecur" en TRUE.
A continuación verifica -y ya suponiendo que estamos en una segunda instancia o llamada recursiva a la función- que si los últimos cinco caracteres de la cadena procesada NO ES "Yenes", entonces analiza más bien si "Yenes" está EN MEDIO de la cadena, y si es así (If posic > 0 Then), entonces la QUITA, e inmediatamente la agrega AL FINAL de la cadena.
TODAS las veces que la función se llame a sí misma hará este análisis, moviendo a la fuerza la palabra "Yenes" al final.
RECONOZCO que esta quizás no sea una solución ELEGANTE, pero sí la más rápida que se me ocurrió. De todos modos espero que te sea útil...
Un abrazo...
Ok, esto pasa por apurarse. Algo no me "olía" bien dentro de la solución que te daba, y de hecho verifiqué que la variable "FlagRecur" es tan INÚTIL como bocina de avión.
LO ÚNICO QUE DEBES HACER ES colocar PARTE del código que te dí anteriormente, haciéndolo en el mismo lugar donde está, es decir, SOBRE EL FINAL DE LA FUNCIÓN, así...
        If Right(Num2Text, 5) <> "Yenes" Then
            posic = InStr(Num2Text, "Yenes")
            If posic > 0 Then
               Num2Text = Left(Num2Text, posic - 1) & Right(Num2Text, Len(Num2Text) - (posic + 5))
               Num2Text = Num2Text & " Yenes"
            End If
        End If
El resto de la explicación es válida, o sea que este agregado lo que hace es MOVER "a la fuerza" a la palabra "Yenes" al final de la cadena obtenida.
MIL PERDONES por el grado de complejidad inútil que te agregué en la respuesta anterior.
Oye muchísimas gracias por tu ayuda, me ah sido de gran utilidad, pero que crees que el código que me diste no se si no hace nada o lo estoy colocando en un lugar inadecuado, por favor corrígeme si estoy mal.
...
Case 1000000000000#: Num2Text = "UN BILLON"
        Case Is < 2000000000000#: Num2Text = "UN BILLON " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
        Case Else: Num2Text = Num2Text(Int(value / 1000000000000#)) & " BILLONES"
            If (value - Int(value / 1000000000000#) * 1000000000000#) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
        End Select
        If Right(Num2Text, 5) <> "Yenes" Then
           posic = InStr(Num2Text, "Yenes")
            If posic > 0 Then
               Num2Text = Left(Num2Text, posic - 1) & Right(Num2Text, Len(Num2Text) - (posic + 5))
               Num2Text = Num2Text & " Yenes"
            End If
        End If

    End Function
Gracias por tu apoyo
Te faltó PRECISAMENTE poner el pequeño trocito de código que tú ya habías hecho, el que agrega la palabra " Yen" o " Yenes", así...
...
Case 1000000000000#: Num2Text = "UN BILLON"
        Case Is < 2000000000000#: Num2Text = "UN BILLON " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
        Case Else: Num2Text = Num2Text(Int(value / 1000000000000#)) & " BILLONES"
            If (value - Int(value / 1000000000000#) * 1000000000000#) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000000000#) * 1000000000000#)
        End Select
            If Text1.Text = 1 Then
                Num2Text = Num2Text & " Yen"
            Else
                Num2Text = Num2Text & " Yenes"
            End If 
   

        If Right(Num2Text, 5) <> "Yenes" Then
           posic = InStr(Num2Text, "Yenes")
            If posic > 0 Then
               Num2Text = Left(Num2Text, posic - 1) & Right(Num2Text, Len(Num2Text) - (posic + 5))
               Num2Text = Num2Text & " Yenes"
            End If
        End If
    End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas