Ver Mensaje Individual
  #8 (permalink)  
Antiguo 22-05-2008, 00:47:49
Avatar de seba123neo
seba123neo seba123neo is offline
Moderador
 
Registrado: nov 2007
Ubicación: Argentina
Posts: 388
seba123neo Valoración +2
Predeterminado Re: Transformar números a palabras...

Hola,te paso un modulo clase que use en un conversor de unidades de medidas..



Código:
Option Explicit
Private astrConversor(0 To 2, 1 To 9) As String
Private mvarNumero As Variant

Public Property Let Numero(ByVal vData As Variant)
If IsNumeric(vData) Then
mvarNumero = vData
End If
End Property

Public Property Get Numero() As Variant
Numero = mvarNumero
End Property

Public Function ALetra() As String
Dim i As Integer
Dim intProceder As Integer
Dim intPosNumero As Integer
Dim intLongNumero As Integer
Dim strNumero As String
Dim strLetraNumero As String
mvarNumero = Abs(mvarNumero)
strNumero = CStr(Fix(mvarNumero))
intLongNumero = Len(strNumero)
intPosNumero = intLongNumero
For i = 1 To intLongNumero
intProceder = True
If (intPosNumero Mod 3) = 1 Then
If intLongNumero > intPosNumero Then
Select Case Mid(strNumero, i - 1, 2)
           Case "00"
             If UCase(Right(strLetraNumero, 7)) = "CIENTO " Then
               strLetraNumero = Left(strLetraNumero, Len(strLetraNumero) - 7)
               strLetraNumero = strLetraNumero & "Cien "
             End If
           Case "11"
             strLetraNumero = Left(strLetraNumero, Len(strLetraNumero) - 5)
             strLetraNumero = strLetraNumero & "Once "
             intProceder = False
           Case "12"
             strLetraNumero = Left(strLetraNumero, Len(strLetraNumero) - 5)
             strLetraNumero = strLetraNumero & "Doce "
             intProceder = False
           Case "13"
             strLetraNumero = Left(strLetraNumero, Len(strLetraNumero) - 5)
             strLetraNumero = strLetraNumero & "Trece "
             intProceder = False
           Case "14"
             strLetraNumero = Left(strLetraNumero, Len(strLetraNumero) - 5)
             strLetraNumero = strLetraNumero & "Catorce "
             intProceder = False
           Case "15"
             strLetraNumero = Left(strLetraNumero, Len(strLetraNumero) - 5)
             strLetraNumero = strLetraNumero & "Quince "
             intProceder = False
           Case "16", "17", "18", "19"
             strLetraNumero = Left(strLetraNumero, Len(strLetraNumero) - 2)
             strLetraNumero = strLetraNumero & "ci"
           Case "21" To "29"
             strLetraNumero = Left(strLetraNumero, Len(strLetraNumero) - 2)
             strLetraNumero = strLetraNumero & "i"
           Case Else
             If Val(Mid(strNumero, i, 1)) > 0 And Val(Mid(strNumero, i - 1, 1)) > 0 Then
               strLetraNumero = strLetraNumero & "y "
             End If
         End Select
       End If
     End If

     If Val(Mid(strNumero, i, 1)) > 0 And intProceder Then
       strLetraNumero = strLetraNumero & astrConversor((intPosNumero Mod 3), Val(Mid(strNumero, i, 1))) & " "
     End If

     Select Case intPosNumero
       Case 4
         If Right(strLetraNumero, 9) <> "millones " And Right(strLetraNumero, 13) <> "mil millones " And Right(strLetraNumero, 9) <> "billones " Then
           strLetraNumero = strLetraNumero & "mil "
         End If
       Case 7
         If Right(strLetraNumero, 13) <> "mil millones " And Right(strLetraNumero, 9) <> "billones " Then
           strLetraNumero = strLetraNumero & "millones "
         End If
       Case 10
         If Right(strLetraNumero, 9) <> "billones " Then
            strLetraNumero = strLetraNumero & "mil "
         End If
       Case 13
         strLetraNumero = strLetraNumero & "billones "
       Case Else
     End Select
     intPosNumero = intPosNumero - 1
   Next i

   strLetraNumero = Left(strLetraNumero, 1) & LCase(Mid(strLetraNumero, 2))
   
   ALetra = strLetraNumero
End Function

Private Sub Asigna()
   astrConversor(0, 1) = "Ciento"
   astrConversor(0, 2) = "Doscientos"
   astrConversor(0, 3) = "Trescientos"
   astrConversor(0, 4) = "Cuatrocientos"
   astrConversor(0, 5) = "Quinientos"
   astrConversor(0, 6) = "Seiscientos"
   astrConversor(0, 7) = "Setecientos"
   astrConversor(0, 8) = "Ochocientos"
   astrConversor(0, 9) = "Novecientos"
   astrConversor(1, 1) = "Uno"
   astrConversor(1, 2) = "Dos"
   astrConversor(1, 3) = "Tres"
   astrConversor(1, 4) = "Cuatro"
   astrConversor(1, 5) = "Cinco"
   astrConversor(1, 6) = "Seis"
   astrConversor(1, 7) = "Siete"
   astrConversor(1, 8) = "Ocho"
   astrConversor(1, 9) = "Nueve"
   astrConversor(2, 1) = "Diez"
   astrConversor(2, 2) = "Veinte"
   astrConversor(2, 3) = "Treinta"
   astrConversor(2, 4) = "Cuarenta"
   astrConversor(2, 5) = "Cincuenta"
   astrConversor(2, 6) = "Sesenta"
   astrConversor(2, 7) = "Setenta"
   astrConversor(2, 8) = "Ochenta"
   astrConversor(2, 9) = "Noventa"
End Sub

Private Sub Class_Initialize()
  Asigna
End Sub

Private Sub Class_Terminate()
  Erase astrConversor
End Sub
en un formulario con 2 textbox escribi esto:

Código:
Private Conversor As New Class1

Private Sub Text1_Change()
Conversor.Numero = Val(Text1.Text)
Text2.Text = Conversor.ALetra
End Sub
aguanta hasta 999999999999999 o sea,"Novecientos noventa y nueve billones novecientos noventa y nueve mil novecientos noventa y nueve millones novecientos noventa y nueve mil novecientos noventa y nueve "

saludos.
__________________
Todos somos ignorantes; lo que pasa es que no todos ignoramos las mismas cosas - Albert Einstein
Responder Con Cita