Pasar numero decimales en textbox a letras

Estoy pasando números decimales a letras, más concretamente los números comprendidos entre el 0,60 al 2,10, con una instrucción de Neckkito, la cual he adaptado a mis necesidades y me funciona bien, pero cuando llego al 1,10 ya no me va tan bien, es decir con la instrucción me sale UNO COMA CERO DIEZ, cuando me debería de salir UNO COMA DIEZ y a partir de esa cifra ya no salen bien el paso a letras, por ejemplo pongo 1,55 y sale UNO COMA CERO CINCUENTA Y CINCO. He estado modificando la instrucción, pero no doy con la tecla. Que debería de modificar en la instrucción, para que a partir de ese número 1,10 me saliera correctamente. Adjunto la instrucción que estoy utilizando y modificada a mis necesidades.

Public Function num2let(ByVal value As Double, Optional vCurr As String) As String

    Dim vDec As String

    vDec = Num2Text(Int(Round((value - Int(value)) * 100)))

    If vDec = "CERO" Then

        If Int(value) = 1 Then

            num2let = "UNO" & " COMA " & " CERO " & vDec & " " & UCase(vCurr)

        Else

            num2let = Num2Text(Int(value)) & " " & UCase(vCurr)

        End If

    Else

        If Int(value) = 1 Then

            num2let = "UNO" & " COMA " & " CERO " & vDec & " " & UCase(vCurr)

        Else

            num2let = Num2Text(Int(value)) & " COMA " & vDec & " " & UCase(vCurr)

        End If

        End If

End Function

Public Function Num2Text(ByVal value As Double) As String

    Select Case value

        Case 0: Num2Text = "CERO"

        Case 1: Num2Text = "UNO"

        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"

  End Select

En el formulario tengo dos textbox, (Texto30, TxtLetras) donde en uno introduzco el numero y en el otro me lo pasa a la siguiente instrucción:

Private Sub Texto30_LostFocus()
Dim vImp As Variant, vImpLet As String
vImp = Me.Texto30.value
' 'Si el importe estuviera en blanco borra valores, si los hubiera, y sale del proceso
If IsNull(vImp) Then
Me.TxtLetras4.value = Null
Exit Sub
End If
'Convertimos el importe a letras a través de la función
vImpLet = num2let(vImp)
'Asignamos el valor obtenido a nuestro cuadro de texto
Me.TxtLetras4.value = vImpLet
End Sub 

1 respuesta

Respuesta
1

No conozco la versión original (la de Neckito), pero si su forma de programar y no utilizaba una coma si no era imprescindible.

Para dar salida rápida a esta adaptación se necesita saber cuantos decimales se utilizaran.
.- Si solo es uno se resuelve en una línea (o dos)
.- Con mas de uno habrá que evaluar el numero de decimales y reconstruir la expresión final.

La duda es sencilla, en el planteamiento del problema se comenta que se utiliza en la escala de 0,6 a 2,10 (en principio es indiferente para la parte entera) pero no para la parte decimal que puede ser 0,1 o 0,11 o 0,01 ...

Utilizo dos decimales , y los valores comprendidos entre 0,60 y 2,10.

Modificar la función Num2Text o sobrescribirla con la que continua:

Public Function num2let(ByVal value As Double, Optional vCurr As String) As String
Dim vDec As String, PDec As Long, PEnt As Long
value = Round(value, 2)
PEnt = Int(value)
PDec = (value - Int(value)) * 100
num2let = Num2Text(PEnt) & " COMA "
vDec = Num2Text(PDec)
num2let = num2let & IIf(PDec > 0 And PDec < 10, "CERO ", "") & vDec & " " & vCurr
End Function

He utilizado esta subfunción para verificar el resultado en la ventana de inmediato:

Public Sub Control()
  Dim Bucle As Double
  For Bucle = 0.6 To 2.1 Step 0.01
  Debug.Print Bucle, num2let(Bucle)
  Next Bucle
  End Sub

El resultado (en la ventana de inmediato) ...
(El foro se queja del exceso de mayúsculas, y he reducido las muestras)

0,6 CERO COMA SESENTA
0,61 cero coma sesenta y uno
0,79 cero coma setenta y nueve
0,8 cero coma ochenta
0,81 cero coma ochenta y uno
0,99 cero coma noventa y nueve
1 uno coma cero
1,01 uno coma cero uno
1,5 uno coma cincuenta
2,1 DOS COMA DIEZ

Disculpas: la función a modificar es num2let

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas