• Domingo 22 de Diciembre de 2024, 20:06

Autor Tema:  Aportando Código  (Leído 1551 veces)

Castord

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Aportando Código
« en: Viernes 2 de Febrero de 2007, 21:49 »
0
Este ejemplo que desarrollé me sirvió bastante a la hora de imprimir en programas de facturación y demás... muy útil aquí y pienso que en otras partes del mundo.. :D

Lée números y los imprime en su formato alfabetico(letras)

Código: Text
  1.  
  2.  
  3. '===============================================
  4. '  ALGORITMO DE LECTURA DE NUMEROS ENTEROS
  5. 'con un rango comprendido entre 1 y 999.999.999
  6. '===============================================
  7. '(C)Carlos Ruiz Díaz - Castord
  8. 'Asunción, 31-ENE-2007, Paraguay
  9. 'Todos los Derechos Reservados
  10. 'Carlos.RuizDiaz@gmail.com
  11. '----------------------------------------------
  12. 'NO SE HACEN TODAS LAS VALIDACIONES NECESARIAS!
  13. '       Código vb5, vb6 Win32 compatible
  14. '               | CONTROLES |
  15. 'un text box, name=Text1
  16. 'un command button, name=Command1
  17. '----------------------------------------------
  18. 'por favor, si encuentran bugs o realizan alguna
  19. 'clase de optimización, reportenmelo al mail
  20. 'adjunto, gracias.
  21. '===============================================
  22.  
  23. Dim Unidades(1 To 9) As String
  24. Dim Decenas(1 To 9) As String
  25. Dim Especiales(11 To 19) As String
  26. Dim Lect(1 To 3) As String
  27. Dim nLect(1 To 3) As Integer
  28. '---------------------------------
  29. 'Dim Millar As String
  30. Dim Cent As String
  31. 'Dim Veinti As String
  32. Dim Centenas(1 To 9) As String
  33. Dim Grupo As Integer
  34. '---------------------------------
  35.  
  36. Function Leer(Nro As String) As Boolean
  37. 'On Error GoTo Error
  38. 'On Error Resume Next
  39. Dim Unidad As String, Decena As String, Centena As String
  40. Dim Cifras As Integer
  41. Dim Aux As String, Parte As String
  42.  
  43. Aux = vbNullString
  44.  
  45. Debug.Print Nro
  46.  
  47. If Val(Nro) = 0 Then 'si la cadena es por ej. '000' resultante del nro 1.000
  48.     Grupo = Grupo + 1
  49.     Lect(Grupo) = Aux
  50.     Exit Function   'sale
  51. End If
  52.  
  53.  
  54. Cifras = Len(Nro)
  55.  
  56. Parte = Mid(Nro, 1, 1) 'extrae las centenas
  57. If Parte > 0 Then 'si es mayor a cero se consulta al vector y se asigna ya el texto respectivo
  58.     Aux = Centenas(Parte)
  59. End If
  60. Parte = CInt(Right(Nro, 2)) 'extrae unidad y decena
  61.  
  62. Unidad = CInt(Right(Nro, 1))
  63. Debug.Print Unidad
  64. Decena = CInt(Mid(Nro, 2, 1))
  65. Debug.Print Decena
  66. Centena = CInt(Left(Nro, 1))
  67. Debug.Print Centena
  68.    
  69.     '======se explicar por si solas algunas condicionales======
  70.    
  71.     If Centena = 0 And Decena = 0 And Unidad > 0 Then 'para '001' por ej.
  72.         Aux = Unidades(Unidad)
  73.     ElseIf Unidad = 0 And Decena = 0 And Centena > 0 Then '100' por ej.
  74.         If Centena = 1 Then 'para cien
  75.            Aux = "cien"
  76.         Else '`para versiones 'ciento'.. .ej. 101
  77.             Aux = Centenas(Mid(Nro, 1, 1))
  78.         End If
  79.     ElseIf Decena = 0 And Unidad > 0 Then '01' por ej.
  80.         Aux = Aux & " " & Unidades(Unidad)
  81.     ElseIf Unidad = 0 And Decena > 0 Then '10' por ej.
  82.         Decena = Mid(Nro, 2, 1)
  83.         Aux = Aux & " " & Decenas(CInt(Decena))
  84.     ElseIf Parte < 20 Then 'para las versiones 'dieci', sin esto el resultado seria
  85.                             'diez uno si el nro fuera 11
  86.         Aux = Aux & " " & Especiales(Parte)
  87.        
  88.     ElseIf Parte > 20 And Parte < 30 Then 'para las versiones 'veinti', sin esto el resultado seria
  89.                             'veinte uno si el nro fuera 21
  90.         Parte = CInt(Mid(Nro, 3, 1))
  91.         Aux = Aux & " Veinti" & Unidades(Parte)
  92.     Else 'para nros, sin ceros >30 y bla bla
  93.         Parte = CInt(Mid(Nro, 2, 1))
  94.         Aux = Aux & " " & Decenas(Parte)
  95.         Parte = CInt(Mid(Nro, 3, 1))
  96.         Aux = Aux & " y " & Unidades(Parte)
  97.     End If
  98.  
  99. 'LOS VALORES LLEGAN DE DERECHA A IZQUIERDA... En el nro. 1.000.123 se leerá 1ro.
  100. 'la porcion '123'
  101.  
  102. 'el vector Lect(1)=CENTENAS
  103. 'el vector Lect(2)=MILLARES
  104. 'el vector Lect(3)=MILLONES
  105.  
  106. Grupo = Grupo + 1 'determina que parte se esta leyendo
  107. Lect(Grupo) = Aux 'coloca aqui el texto
  108. nLect(Grupo) = Val(Nro) 'coloca aqui el nro.
  109. Nro = vbNullString
  110. Leer = True
  111. Exit Function
  112. Error:
  113.     Leer = False
  114.     MsgBox Err.Description
  115. End Function
  116.  
  117. Function SetearNro() As Boolean
  118. On Error GoTo Error
  119. Dim Nro As String, Parte As String, Limit As Integer
  120. Nro = Text1.Text
  121. If Val(Nro) > 999999999 Or Val(Nro) < 1 Then
  122.     MsgBox "Error en rango de lectura", vbInformation
  123.     MsgBox "1 al 999.999.999 nomás!"
  124.     SetearNro = False
  125.     Exit Function
  126. End If
  127. 'el programa toma los nros como cadenas de 3 caracteres por lo que esta sub es
  128. 'muy necesaria para que funcione
  129.  
  130. If Len(Nro) < 3 Then 'si el nro fue por ej. '3' el resultado será '003'
  131.                     ' para satisfacer la condicion
  132.     Nro = String(3 - Len(Nro), "0") & Nro
  133.     'MsgBox Nro
  134. End If
  135.  
  136. Parte = vbNullString
  137.  
  138. 'los nros de descomponen al estilo notacional corriente... ej. 1.000.000
  139. 'donde el . (punto) es el separador de millares
  140.  
  141. '=====determinar el limite del bucle=======
  142. 'ej... el nro 100.000 tiene dos partes de 3 cifras por lo que
  143. 'de acuerdo el algoritmo de abajo el limite es 2. En el nro 1.100.123
  144. 'se tiene dos partes de 3 cifras y una de una cifra pero el bucle se debe ejecutar
  145. '3 veces para poder tomar tb. el '1', ya que las porciones '100' y '123' cumplen
  146. 'con las condiciones de 3 cifras... para el caso del '1' se correrá el algoritmo
  147. 'correspondiente para comvertirlo a '001' y formar asi el nro 001.100.123 compatible
  148.  
  149. If (Len(Nro) / 3) > (Round(Len(Nro) / 3)) Then
  150.     Limit = Round(Len(Nro) / 3) + 1
  151. Else
  152.     Limit = Len(Nro) / 3
  153. End If
  154.  
  155. For i = 1 To Limit
  156. Debug.Print Nro
  157.     If Len(Nro) < 3 Then 'para nros de de longitud menor a 3, nunca debe entrar a la 1ra.
  158.         Nro = String(3 - Len(Nro), "0") & Nro
  159.         'Nro = Right(Nro, Len(Nro))
  160.         'MsgBox Nro
  161.         Leer (Nro) 'pasa el arg. a la funcion de lectura
  162.         Debug.Print Nro
  163.     Else
  164.         Parte = Right(Nro, 3) 'leer las ultimas 3 cifras del nro
  165.         Debug.Print Parte
  166.         Leer (Parte)
  167.         Nro = Left(Nro, Len(Nro) - 3) 'extraer la parte leida de la cadena original
  168.         Debug.Print Nro               'y reasignar a la var original el resto de la
  169.                                       'cadena descompuesta
  170.     End If
  171. Next
  172. SetearNro = True
  173. Exit Function
  174. Error:
  175.     MsgBox Err.Description
  176.     SetearNro = False
  177. End Function
  178. Private Sub Command1_Click()
  179. Dim ok As Boolean
  180. ok = SetearNro
  181. If ok = False Then
  182.     Exit Sub
  183. End If
  184.  
  185. '==========================================
  186. 'diferenciar los millones, miles y centenas
  187. '==========================================
  188. Dim Texto As String
  189. Texto = vbNullString
  190.  
  191. If Lect(3) <> vbNullString Then 'millones
  192.     If nLect(3) = 1 Then
  193.         Texto = "Un millón "
  194.     Else
  195.         Texto = Lect(3) & " millones "
  196.     End If
  197. End If
  198. If Lect(2) <> vbNullString Then 'miles
  199.     'If nLect(2) = 1 Then
  200.      '   Texto = Texto & Lect(2) & " mil "
  201.     'Else
  202.         Texto = Texto & Lect(2) & " mil "
  203.     'End If
  204. End If
  205. If Lect(1) <> vbNullString Then 'centenas
  206.     Texto = Texto & Lect(1)
  207. End If
  208.  
  209. Texto = Trim(Texto) 'sacar de la cadena los espacios en blanco en ambos lados
  210. 'MsgBox Texto, , "TEXTO SIN FORMATO TITULO"
  211. MsgBox Estilo(Texto) 'texto en estilo titulo.
  212.                         'Ej. "ani reñembotavy nde tembo" se verá
  213.                         'como "Ani Reñembotavy Nde Tembo"
  214. '================
  215. ' Reinicializar
  216. '================
  217. Grupo = 0
  218. For i = 1 To UBound(Lect, 1)
  219.     Lect(i) = vbNullString
  220.     nLect(i) = 0
  221. Next
  222. End Sub
  223.  
  224. Function Estilo(Texto As String) As String
  225. 'On Error Resume Next
  226. Dim i As Integer, Pos As String, SubStrPre As String, SubStrPos As String
  227. Dim MayusChar As String
  228. Dim Char As String
  229. Dim n As String
  230. For i = 1 To Len(Texto)
  231.     Pos = InStr(i, Texto, " ") 'buscar espacios en blanco
  232.     Debug.Print Pos
  233.     Char = Mid(Texto, Pos + 1, 1) 'extraer el caracter luego del espacio en blaco
  234.     Debug.Print Char
  235.     SubStrPre = Left(Texto, Pos) 'extraer al cadena anterior al caracter
  236.     Debug.Print SubStr
  237.     SubStrPos = Right(Texto, Len(Texto) - (Pos + 1)) 'extraer la cadena posterior al char
  238.     Debug.Print SubStrPos
  239.     MayusChar = UCase(Char) 'convertir el char a su version muyuscula
  240.     Texto = SubStrPre & MayusChar & SubStrPos 'concatenar la cadena anterior el caracter
  241.                                             'y la cadena posterior en la var original
  242.     Debug.Print Texto
  243. Next
  244. Estilo = Texto
  245.  
  246.  
  247. End Function
  248.  
  249. Private Sub Command3_Click()
  250. MsgBox Estilo(Text1.Text)
  251. End Sub
  252.  
  253. Private Sub Form_Load()
  254. 'VECTORES DE CADENAS
  255. Unidades(1) = "uno"
  256. Unidades(2) = "dos"
  257. Unidades(3) = "tres"
  258. Unidades(4) = "cuatro"
  259. Unidades(5) = "cinco"
  260. Unidades(6) = "seis"
  261. Unidades(7) = "siete"
  262. Unidades(8) = "ocho"
  263. Unidades(9) = "nueve"
  264.  
  265. Especiales(11) = "once"
  266. Especiales(12) = "doce"
  267. Especiales(13) = "trece"
  268. Especiales(14) = "catorce"
  269. Especiales(15) = "quince"
  270. Especiales(16) = "dieciseis"
  271. Especiales(17) = "diecisiete"
  272. Especiales(18) = "dieciocho"
  273. Especiales(19) = "diecinueve"
  274.  
  275. Decenas(1) = "diez"
  276. Decenas(2) = "veinte"
  277. Decenas(3) = "treinta"
  278. Decenas(4) = "cuarenta"
  279. Decenas(5) = "cincuenta"
  280. Decenas(6) = "sesenta"
  281. Decenas(7) = "setenta"
  282. Decenas(8) = "ochenta"
  283. Decenas(9) = "noventa"
  284.  
  285. Centenas(1) = "ciento"
  286. Centenas(2) = "doscientos"
  287. Centenas(3) = "trescientos"
  288. Centenas(4) = "cuatrocientos"
  289. Centenas(5) = "quinientos"
  290. Centenas(6) = "seiscientos"
  291. Centenas(7) = "setecientos"
  292. Centenas(8) = "ochocientos"
  293. Centenas(9) = "novecientos"
  294.  
  295. 'Veinti = "veinti"
  296. 'Millar = "mil"
  297.  
  298. End Sub
  299.  
  300.  
  301.  
  302.  

Castord

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Aportando Código
« Respuesta #1 en: Viernes 2 de Febrero de 2007, 21:51 »
0
ahhh...

fíjense y comenten :D

ElNapster

  • Moderador
  • ******
  • Mensajes: 727
    • Ver Perfil
Re: Aportando Código
« Respuesta #2 en: Viernes 2 de Febrero de 2007, 22:00 »
0
Al ingresar un valor fuera del rango te da una alerta, al querer yo ingresar otro valor permitido me siguie dando error ... me imagino que no se debe de estar limpiando una variable por ahi...
Pero esta interesante tu aporte ......  B)

... va otra ingresa este valor 10g6 y veras el mensaje que te da .. :scream:
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
"Somos lo que imaginamos ser"
-- --------------------------------------------------------------
-ElNapster
-Designer / Developer Software
-GuaTemALa



Castord

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Aportando Código
« Respuesta #3 en: Viernes 2 de Febrero de 2007, 22:22 »
0
si... pasa que aclaré que no se verifican todas las variables ingresadas, puse eso como comentario...
fijate..

además... suprimí esa parte de validaciones porque la funcion que llamaba a escribir nros. siempre enviaba datos validos..

tb. se del 'error gramatical' al llamar a nros. como 1029... pasa que ignore eso debido a que las facturas aca siempre superan los millones...