CifrasEnLetras.bas

  1. 'Option Compare Database
  2. Option Explicit
  3.  
  4. 'CifrasEnLetras
  5. ' Francisco Cascales <fco@proinf.net>
  6. '
  7. 'Uso:
  8. ' ConvertirEurosEnLetras(22.34) --> "veintidós euros con treinta y cuatro céntimos"
  9. ' ConvertirNumeroEnLetras("35,67") --> "treinta y cinco con sesenta y siete"
  10. '
  11. 'Descripción:
  12. ' - Expresa un número entero en letra. Por ejemplo: convierte "22" en "veintidós"
  13. ' - El número puede ser de 1 hasta 126 cifras como máximo.
  14. '
  15. 'Propósito:
  16. ' Mi propósito es que el código no necesite comentarios para que sea claro. Para ello intento crear
  17. ' una serie de rutinas breves, autodescriptivas, fáciles de comprender, mantener y probar por separado.
  18. '
  19. 'Estado actual del tema en la Red:
  20. ' Funciones que conviertan cifras en letras hay muchas si buscamos en la Red, pero en todas
  21. ' las que he probado habían errores:
  22. ' - Acentuación: poner "veintidos" sin acento.
  23. ' - Negatividad: "-0" como "menos cero" en vez de "cero"
  24. ' - Plurales.
  25. ' - El cero.
  26. ' - Espacios en blanco de más.
  27. ' - Palabras de más: Expresar el número "10.001.000" como "diez millones un mil" en vez de
  28. ' por "diez millones mil" com debería ser.
  29. '
  30. 'Enlaces útiles:
  31. ' - Lista de números en la Wikipedia: http://es.wikipedia.org/wiki/Anexo:Lista_de_n%C3%BAmeros
  32. ' - Signos matemáticos en Encarta: http://es.encarta.msn.com/encyclopedia_761577100/Signos_matem%C3%A1ticos.html
  33. ' - "Nombres de los números en español" en la Wikipedia
  34. '
  35. 'Versiones:
  36. ' version 0.01, 8-dic-2007 - Inicio del proyecto
  37. ' version 0.02, 12-dic-2007 - Cifras en femenino
  38. ' version 0.04, 22-dic-2007 - Múltiplos de millón con preposición "de" antes del concepto:
  39. ' "un millón de euros", "dos millones de euros", "un millón mil un euros"
  40. ' Las cifras superiores al millón siempre en masculino.
  41. ' "doscientos millones doscientas mil personas"
  42.  
  43. Private Const PREFIJO_ERROR = "Error: "
  44. Private Const COMA = ","
  45. Private Const MENOS = "-"
  46.  
  47. Enum EnumGenero
  48. neutro
  49. Masculino
  50. Femenino
  51. End Enum
  52.  
  53. Public Function ListaUnidades(ByVal unidades As Integer, _
  54. Optional ByVal genero As EnumGenero = neutro _
  55. ) As String
  56. 'Primeros treinta números: Números del cero al veintinueve
  57. 'Ejemplo: ListaUnidades(2) --> "dos"
  58.  
  59. If unidades = 1 And genero = Masculino Then
  60. ListaUnidades = "uno"
  61. ElseIf unidades = 1 And genero = Femenino Then
  62. ListaUnidades = "una"
  63. ElseIf unidades = 21 And genero = Masculino Then
  64. ListaUnidades = "veintiuno"
  65. ElseIf unidades = 21 And genero = Femenino Then
  66. ListaUnidades = "veintiuna"
  67. Else
  68. ListaUnidades = Array("cero", "un", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", _
  69. "diez", "once", "doce", "trece", "catorce", "quince", "dieciséis", "diecisiete", "dieciocho", "diecinueve", "veinte", _
  70. "veintiún", "veintidós", "veintitrés", "veinticuatro", "veinticinco", "veintiséis", "veintisiete", "veintiocho", "veintinueve")(unidades)
  71. End If
  72.  
  73. End Function
  74.  
  75. Public Function ListaDecenas(ByVal decena As Integer) As String
  76. 'Ejemplo: ListaDecenas(2) --> "veinte"
  77. ListaDecenas = Array("", "diez", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa")(decena)
  78. End Function
  79.  
  80. Public Function ListaCentenas(ByVal centena As Integer, _
  81. Optional ByVal genero As EnumGenero = neutro _
  82. ) As String
  83. 'Ejemplo: ListaCentenas(2) --> "doscientos"
  84.  
  85. ListaCentenas = Array("", "cien", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos", "novecientos")(centena)
  86. If genero = Femenino Then ListaCentenas = Replace(ListaCentenas, "iento", "ienta")
  87.  
  88. End Function
  89.  
  90. Public Function ListaOrdenesMillones(ByVal orden As Integer, ByVal enPlural As Boolean) As String
  91. 'Ordenes de millón: 10^6, 10^12, 10^18, 10^24, ..., 10^120
  92. 'Ejemplo: ListaOrdenesMillones(2, enPlural:=false) --> "billón"
  93. If enPlural = False Then
  94. ListaOrdenesMillones = Array("", "millón", "billón", "trillón", "cuatrillón", "quintillón", _
  95. "sextillón", "septillón", "octillón", "nonillón", "decillón", _
  96. "undecillón", "duodecillón", "tridecillón", "cuatridecillón", "quidecillón", _
  97. "sexdecillón", "septidecillón", "octodecillón", "nonidecillón", "vigillón")(orden)
  98. Else
  99. ListaOrdenesMillones = Array("", "millones", "billones", "trillones", "cuatrillones", "quintillones", _
  100. "sextillones", "septillones", "octillones", "nonillones", "decillones", _
  101. "undecillones", "duodecillones", "tridecillones", "cuatridecillones", "quidecillones", _
  102. "sexdecillones", "septidecillones", "octodecillones", "nonidecillones", "vigillones")(orden)
  103. End If
  104. End Function
  105.  
  106. Public Function ConvertirDosCifras(ByVal cifras As Integer, _
  107. Optional ByVal genero As EnumGenero = neutro _
  108. ) As String
  109. 'Primer centenar: del cero al noventa y nueve
  110. 'Ejemplo: ConvertirDosCifras(22) --> "veintidós"
  111. Dim unidad As Integer: unidad = cifras Mod 10
  112. Dim decena As Integer: decena = cifras \ 10
  113. If cifras < 30 Then
  114. ConvertirDosCifras = ListaUnidades(cifras, genero)
  115. ElseIf unidad = 0 Then
  116. ConvertirDosCifras = ListaDecenas(decena)
  117. Else
  118. ConvertirDosCifras = ListaDecenas(decena) & " y " & ListaUnidades(unidad, genero)
  119. End If
  120. End Function
  121.  
  122. Public Function ConvertirTresCifras(ByVal cifras As Integer, _
  123. Optional ByVal genero As EnumGenero = neutro _
  124. ) As String
  125. 'Primer millar: del cero al novecientos noventa y nueve
  126. 'Ejemplo: ConvertirTresCifras(222) --> "doscientos veintidós"
  127. Dim decenas_y_unidades As Integer: decenas_y_unidades = cifras Mod 100
  128. Dim centenas As Integer: centenas = cifras \ 100
  129. If cifras < 100 Then
  130. ConvertirTresCifras = ConvertirDosCifras(cifras, genero)
  131. ElseIf decenas_y_unidades = 0 Then
  132. ConvertirTresCifras = ListaCentenas(centenas, genero)
  133. ElseIf centenas = 1 Then
  134. ConvertirTresCifras = "ciento " & ConvertirDosCifras(decenas_y_unidades, genero)
  135. Else
  136. ConvertirTresCifras = ListaCentenas(centenas, genero) & " " & ConvertirDosCifras(decenas_y_unidades, genero)
  137. End If
  138. End Function
  139.  
  140. Public Function ConvertirSeisCifras(ByVal cifras As Long, _
  141. Optional ByVal genero As EnumGenero = neutro _
  142. ) As String
  143. 'Primer millón: del cero al novecientos noventa y nueve mil novecientos noventa y nueve
  144. 'Ejemplo: ConvertirSeisCifras(222222) --> "doscientos veintidós mil doscientos veintidós"
  145. Dim primerMillar As Integer: primerMillar = cifras Mod 1000
  146. Dim grupoMiles As Integer: grupoMiles = cifras \ 1000
  147. Dim generoMiles As EnumGenero: generoMiles = IIf(genero = Masculino, neutro, genero)
  148. If grupoMiles = 0 Then
  149. ConvertirSeisCifras = ConvertirTresCifras(primerMillar, genero)
  150. ElseIf grupoMiles = 1 Then
  151. If primerMillar = 0 Then
  152. ConvertirSeisCifras = "mil"
  153. Else
  154. ConvertirSeisCifras = "mil " & ConvertirTresCifras(primerMillar, genero)
  155. End If
  156. ElseIf primerMillar = 0 Then
  157. ConvertirSeisCifras = ConvertirTresCifras(grupoMiles, generoMiles) & " mil"
  158. Else
  159. ConvertirSeisCifras = ConvertirTresCifras(grupoMiles, generoMiles) & " mil " & ConvertirTresCifras(primerMillar, genero)
  160. End If
  161. End Function
  162.  
  163.  
  164. Public Function ConvertirCifrasEnLetras(ByVal cifras As String, _
  165. Optional ByVal genero As EnumGenero = neutro, _
  166. Optional ByVal separadorGruposSeisCifras As String = " " _
  167. ) As String
  168. 'Números enteros entre el cero y el novecientos noventa y nueve mil novecientos noventa y nueve vigillones... etc, etc.
  169. 'Es decir entre el 0 y el (10^126)-1
  170. 'o bien números entre 1 y 126 cifras.
  171. 'Ejemplos:
  172. ' ConvertirCifrasEnLetras("22222222") --> "veintidós millones doscientos veintidós mil doscientos veintidós"
  173. ' ConvertirCifrasEnLetras("") --> "No hay ningún número"
  174. ' ConvertirCifrasEnLetras(string(127,"9")) --> "El número es demasiado grande ya que tiene más de 126 cifras"
  175. ' ConvertirCifrasEnLetras("0x") --> "Uno de los caracteres no es una cifra decimal"
  176. ' ConvertirCifrasEnLetras(string(126,"9")) --> "novecientos noventa y nueve mil novecientos noventa y nueve vigillones..."
  177. ' ConvertirCifrasEnLetras(10 ^ 6) --> "un millón"
  178. ' ConvertirCifrasEnLetras(10 ^ 12) --> "un billón"
  179. ' ConvertirCifrasEnLetras(10200050) --> "diez millones doscientos mil cincuenta"
  180. ' ConvertirCifrasEnLetras(10001000) --> "diez millones mil"
  181. ' ConvertirCifrasEnLetras("1" & String(120, "0")) --> "un vigillón"
  182. ' ConvertirCifrasEnLetras ("2" & String(18, "0")) --> "dos trillones"
  183. ' ConvertirCifrasEnLetras("4792347927489", separadorGrupos:=vbCrLf) --> "..."
  184. ' ConvertirCifrasEnletras("521201",True) --> "quinientas veintiuna mil doscientas una"
  185.  
  186. Dim numeroCifras As Integer
  187. Dim indiceCifra As Integer
  188. Dim cifra As String * 1
  189. Dim numeroGruposSeisCifras As Integer
  190. Dim cerosIzquierda As String
  191. Dim indiceGrupo As Integer
  192. Dim ordenMillon As Integer
  193. Dim seisCifras As Long
  194. Dim letras As String
  195. Dim resultado As String
  196.  
  197. 'Inicialización
  198. cifras = Trim(cifras)
  199. numeroCifras = Len(cifras)
  200.  
  201. 'Comprobación
  202. If numeroCifras = 0 Then
  203. ConvertirCifrasEnLetras = PREFIJO_ERROR & "No hay ningún número"
  204. Exit Function
  205. End If
  206. For indiceCifra = 1 To numeroCifras
  207. cifra = Mid(cifras, indiceCifra, 1)
  208. If InStr("0123456789", cifra) = 0 Then
  209. ConvertirCifrasEnLetras = PREFIJO_ERROR & "Uno de los caracteres no es una cifra decimal"
  210. Exit Function
  211. End If
  212. Next
  213. If numeroCifras > 126 Then
  214. ConvertirCifrasEnLetras = PREFIJO_ERROR & "El número es demasiado grande ya que tiene más de 126 cifras"
  215. Exit Function
  216. End If
  217.  
  218. 'Preparación
  219. numeroGruposSeisCifras = numeroCifras \ 6 + Sgn(numeroCifras Mod 6)
  220. cerosIzquierda = String(numeroGruposSeisCifras * 6 - numeroCifras, "0")
  221. cifras = cerosIzquierda & cifras
  222. ordenMillon = numeroGruposSeisCifras - 1
  223.  
  224. 'Procesamiento
  225. resultado = ""
  226. For indiceGrupo = 0 To numeroGruposSeisCifras - 1
  227. seisCifras = CLng(Mid(cifras, indiceGrupo * 6 + 1, 6))
  228. If seisCifras <> 0 Then
  229. If resultado <> "" Then resultado = resultado & " "
  230.  
  231. If ordenMillon = 0 Then
  232. letras = ConvertirSeisCifras(seisCifras, genero)
  233. ElseIf seisCifras = 1 Then
  234. letras = "un " & ListaOrdenesMillones(ordenMillon, enPlural:="false")
  235. Else
  236. letras = ConvertirSeisCifras(seisCifras, neutro) & " " & ListaOrdenesMillones(ordenMillon, enPlural:="true")
  237. End If
  238.  
  239. resultado = resultado & letras
  240. End If
  241. ordenMillon = ordenMillon - 1
  242. Next
  243.  
  244. If resultado = "" Then resultado = ListaUnidades(0)
  245. ConvertirCifrasEnLetras = resultado
  246.  
  247. End Function
  248.  
  249. Public Function DejarSoloCaracteresDeseados(ByVal texto As String, ByVal caracteresDeseados As String) As String
  250. 'Ejemplos:
  251. ' DejarSoloCaracteresDeseados("89.500.400","0123456789") --> "89500400"
  252. ' DejarSoloCaracteresDeseados("ABC-000-123-X-456","0123456789") --> "000123456"
  253. Dim indice As Integer
  254. Dim caracter As String * 1
  255.  
  256. indice = 1
  257. Do Until indice > Len(texto)
  258. caracter = Mid(texto, indice, 1)
  259. If InStr(caracteresDeseados, caracter) = 0 Then
  260. texto = Left(texto, indice - 1) & Mid(texto, indice + 1)
  261. Else
  262. indice = indice + 1
  263. End If
  264. Loop
  265.  
  266. DejarSoloCaracteresDeseados = texto
  267. End Function
  268.  
  269. Public Function NumeroRepeticiones(ByVal texto As String, ByVal caracteres As String) As Integer
  270. 'Ejemplos:
  271. ' NumeroRepeticiones("89.500.400","0") --> 4
  272. Dim indice As Integer
  273. Dim caracter As String * 1
  274.  
  275. NumeroRepeticiones = 0
  276. For indice = 1 To Len(texto)
  277. caracter = Mid(texto, indice, 1)
  278. If InStr(caracteres, caracter) <> 0 Then
  279. NumeroRepeticiones = NumeroRepeticiones + 1
  280. End If
  281. Next
  282. End Function
  283.  
  284. Public Function ConvertirNumeroEnLetras(ByVal cifras As String, _
  285. Optional ByVal numeroDecimales As Integer = -1, _
  286. Optional ByVal palabraEnteraSingular As String = "", Optional ByVal palabraDecimalSingular As String = "", _
  287. Optional ByVal esFemeninaPalabraEntera As Boolean = False, Optional ByVal esFemeninaPalabraDecimal As Boolean = False, _
  288. Optional ByVal palabraEnteraPlural As String = "", Optional ByVal palabraDecimalPlural As String = "" _
  289. ) As String
  290. 'Expresa un número con decimales y signo en letras
  291. ' acompañado del tipo de medida para la parte entera y la parte decimal
  292. 'Ejemplos:
  293. ' ConvertirNumeroEnLetras("-123,45",2) --> "menos ciento veintitrés con cuarenta y cinco"
  294. ' ConvertirNumeroEnLetras("2.000,25", 3, "kilo","gramo") --> "dos mil kilos con doscientos cincuenta gramos"
  295. ' ConvertirNumeroEnLetras("43,005", 3, "kilómetro","metro") --> "cuarenta y tres kilómetros con cinco metros"
  296. ' ConvertirNumeroEnLetras("1.270,23", 2, "euro","céntimo") --> "mil doscientos setenta euros con veintitrés céntimos"
  297. ' ConvertirNumeroEnLetras("1", 2, "euro","céntimo") --> "un euro con cero céntimos"
  298. ' ConvertirNumeroEnLetras("0,678", 2, "euro","céntimo") --> "cero euros con sesenta y siete céntimos"
  299. ' ConvertirNumeroEnLetras("22.000,55", 0, "euro") --> "veintidós mil euros"
  300. ' ConvertirNumeroEnLetras("-,889") --> "menos cero con ochocientos ochenta y nueve"
  301. ' ConvertirNumeroEnLetras("1,5", 2, "peseta", "céntimo", True) --> "una peseta con cincuenta céntimos"
  302. ' ConvertirNumeroEnLetras("300,56", 3, "segundo", "milésima", False, True) --> "trescientos segundos con quinientas sesenta milésimas"
  303. ' ConvertirNumeroEnLetras("21,21",2,"niño","niña",false,true) --> "veintiún niños con veintiuna niñas"
  304. ' ConvertirNumeroEnLetras(32,0,"camión",palabraEnteraPlural:="camiones") --> "treinta y dos camiones"
  305.  
  306. Dim repeticionesComa As Integer, repeticionesMenos As Integer
  307. Dim cifrasEntera As String, cifrasDecimal As String
  308. Dim letrasEntera As String, letrasDecimal As String
  309. Dim palabraEntera As String, palabraDecimal As String
  310. Dim parteEntera As String, parteDecimal As String
  311. Dim posicionComa As Integer
  312. Dim cerosDerecha As String
  313. Dim esNegativo As Boolean
  314. Dim esAutomaticoDecimales As Boolean
  315. Dim esCero As Boolean
  316. Dim resultado As String
  317.  
  318. 'Valores predeterminados
  319. If palabraEnteraSingular <> "" And palabraEnteraPlural = "" Then palabraEnteraPlural = palabraEnteraSingular & "s"
  320. If palabraDecimalSingular <> "" And palabraDecimalPlural = "" Then palabraDecimalPlural = palabraDecimalSingular & "s"
  321.  
  322. 'Limpieza
  323. cifras = DejarSoloCaracteresDeseados(cifras, "0123456789" & COMA & MENOS)
  324.  
  325. 'Comprobaciones
  326. repeticionesMenos = NumeroRepeticiones(cifras, MENOS)
  327. repeticionesComa = NumeroRepeticiones(cifras, COMA)
  328. If repeticionesMenos > 1 Or (repeticionesMenos = 1 And Left(cifras, 1) <> MENOS) Then
  329. ConvertirNumeroEnLetras = PREFIJO_ERROR & "Símbolo negativo incorrecto o demasiados símbolos negativos"
  330. Exit Function
  331. ElseIf repeticionesComa > 1 Then
  332. ConvertirNumeroEnLetras = PREFIJO_ERROR & "Demasiadas comas decimales"
  333. Exit Function
  334. End If
  335.  
  336. 'Negatividad
  337. esNegativo = Left(cifras, 1) = MENOS
  338. If esNegativo Then cifras = Mid(cifras, 2)
  339.  
  340. 'Preparación
  341. posicionComa = InStr(cifras, COMA)
  342. If posicionComa = 0 Then posicionComa = Len(cifras) + 1
  343.  
  344. cifrasEntera = Left(cifras, posicionComa - 1)
  345. If cifrasEntera = "" Or cifrasEntera = MENOS Then cifrasEntera = "0"
  346. cifrasDecimal = Mid(cifras, posicionComa + 1)
  347.  
  348. esAutomaticoDecimales = numeroDecimales < 0
  349. If esAutomaticoDecimales Then
  350. numeroDecimales = Len(cifrasDecimal)
  351. Else
  352. cifrasDecimal = Left(cifrasDecimal, numeroDecimales)
  353. cerosDerecha = String(numeroDecimales - Len(cifrasDecimal), "0")
  354. cifrasDecimal = cifrasDecimal & cerosDerecha
  355. End If
  356.  
  357. 'Cero
  358. esCero = DejarSoloCaracteresDeseados(cifrasEntera, "123456789") = "" And _
  359. DejarSoloCaracteresDeseados(cifrasDecimal, "123456789") = ""
  360.  
  361. 'Procesar
  362. resultado = ""
  363.  
  364. If esNegativo And Not esCero Then resultado = "menos "
  365.  
  366. parteEntera = procesarEnLetras(cifrasEntera, palabraEnteraSingular, palabraEnteraPlural, esFemeninaPalabraEntera)
  367. If Left(parteEntera, Len(PREFIJO_ERROR)) = PREFIJO_ERROR Then
  368. ConvertirNumeroEnLetras = parteEntera
  369. Exit Function
  370. End If
  371.  
  372. resultado = resultado & parteEntera
  373.  
  374. If cifrasDecimal <> "" Then
  375. parteDecimal = procesarEnLetras(cifrasDecimal, palabraDecimalSingular, palabraDecimalPlural, esFemeninaPalabraDecimal)
  376. If Left(parteDecimal, Len(PREFIJO_ERROR)) = PREFIJO_ERROR Then
  377. ConvertirNumeroEnLetras = parteDecimal
  378. Exit Function
  379. End If
  380. resultado = resultado & " con " & parteDecimal
  381. End If
  382.  
  383. ConvertirNumeroEnLetras = resultado
  384.  
  385. End Function
  386.  
  387. Private Function procesarEnLetras(ByVal cifras As String, _
  388. ByVal palabraSingular As String, ByVal palabraplural As String, ByVal esFemenina As Boolean _
  389. ) As String
  390. ' Función auxiliar de convertirNumeroEnLetras
  391. ' para procesar por separado la parte entera y la parte decimal
  392.  
  393. Dim letras As String
  394. Dim genero As EnumGenero
  395. Dim esCero As Boolean
  396. Dim esUno As Boolean
  397. Dim esMultiploMillon As Boolean
  398. Dim palabra As String
  399. Dim resultado As String
  400.  
  401. 'Género
  402. genero = neutro
  403. If esFemenina Then
  404. genero = Femenino
  405. ElseIf palabraSingular = "" Then
  406. genero = Masculino
  407. End If
  408.  
  409. 'Letras
  410. letras = ConvertirCifrasEnLetras(cifras, genero)
  411. If Left(letras, Len(PREFIJO_ERROR)) = PREFIJO_ERROR Then
  412. procesarEnLetras = letras
  413. Exit Function
  414. End If
  415.  
  416. 'Propiedades
  417. esCero = letras = "cero" Or letras = ""
  418. esUno = letras = "un" Or letras = "una" Or letras = "uno"
  419. esMultiploMillon = Not esCero And Right(cifras, 6) = "000000"
  420.  
  421. 'Palabra
  422. palabra = ""
  423. If palabraSingular <> "" Then
  424. If esUno Or palabraplural = "" Then
  425. palabra = palabraSingular
  426. Else
  427. palabra = palabraplural
  428. End If
  429. End If
  430.  
  431. 'Resultado
  432. resultado = letras
  433. If palabra <> "" Then
  434. resultado = resultado & IIf(esMultiploMillon, " de ", " ") & palabra
  435. End If
  436. procesarEnLetras = resultado
  437.  
  438. End Function
  439.  
  440. Public Function ConvertirEurosEnLetras(ByVal euros As Currency) As String
  441. 'Al ser de tipo Currency el intervalo es -922.337.203.685.477,5808 a 922.337.203.685.477,5807
  442. Dim cifras As String
  443. ConvertirEurosEnLetras = ConvertirNumeroEnLetras(Format(euros, "0.00"), 2, "euro", "céntimo")
  444. End Function
  445.  
  446. Private Function TEST(cifra, prueba, referencia) As String
  447. TEST = IIf(prueba = referencia, "correcto", "ERROR") & ": " & cifra & " = " & prueba
  448. End Function
  449. Public Sub TEST_ConvertirDosCifras()
  450. Dim pruebas(): pruebas = Array(0, 1, 2, 7, 10, 12, 22, 30, 50, 66, 84, 99)
  451. Dim referencias(): referencias = Array("cero", "un", "dos", "siete", "diez", "doce", "veintidós", "treinta", "cincuenta", "sesenta y seis", "ochenta y cuatro", "noventa y nueve")
  452. Dim indice As Integer
  453. Dim cifras As Long
  454. For indice = 0 To UBound(pruebas)
  455. cifras = pruebas(indice)
  456. Debug.Print TEST(cifras, ConvertirSeisCifras(cifras), referencias(indice))
  457. Next
  458. Randomize
  459. For indice = 0 To 10
  460. cifras = Int(Rnd * 10 ^ 2)
  461. Debug.Print "aleatorio: " & cifras & " = " & ConvertirDosCifras(cifras)
  462. Next
  463. End Sub
  464. Public Sub TEST_ConvertirTresCifras()
  465. Dim pruebas(): pruebas = Array(44, 300, 100, 121, 438, 999)
  466. Dim referencias(): referencias = Array("cuarenta y cuatro", "trescientos", "cien", "ciento veintiún", "cuatrocientos treinta y ocho", "novecientos noventa y nueve")
  467. Dim indice As Integer
  468. Dim cifras As Long
  469. For indice = 0 To UBound(pruebas)
  470. cifras = pruebas(indice)
  471. Debug.Print TEST(cifras, ConvertirTresCifras(cifras), referencias(indice))
  472. Next
  473. Randomize
  474. For indice = 0 To 10
  475. cifras = Int(Rnd * 10 ^ Int(Rnd * 4))
  476. Debug.Print "aleatorio: " & cifras & " = " & ConvertirTresCifras(cifras)
  477. Next
  478. End Sub
  479. Public Sub TEST_ConvertirSeisCifras()
  480. Dim pruebas(): pruebas = Array(781, 1000, 1001, 1200, 320000, 458926, 999999)
  481. Dim referencias(): referencias = Array("setecientos ochenta y un", "mil", "mil un", "mil doscientos", "trescientos veinte mil", "cuatrocientos cincuenta y ocho mil novecientos veintiséis", "novecientos noventa y nueve mil novecientos noventa y nueve")
  482. Dim indice As Integer
  483. Dim cifras As Long
  484. For indice = 0 To UBound(pruebas)
  485. cifras = pruebas(indice)
  486. Debug.Print TEST(cifras, ConvertirSeisCifras(cifras), referencias(indice))
  487. Next
  488. Randomize
  489. For indice = 0 To 10
  490. cifras = Int(Rnd * 10 ^ Int(Rnd * 7))
  491. Debug.Print "aleatorio: " & cifras & " = " & ConvertirSeisCifras(cifras)
  492. Next
  493. End Sub
  494. Public Sub TEST_ConvertirCifrasEnLetras()
  495. Dim cifras As String
  496. Dim indice As Integer
  497. Randomize
  498. For indice = 1 To Int(Rnd * 126) + 1
  499. cifras = cifras & Mid("0123456789", Int(Rnd * 10) + 1, 1)
  500. Next
  501. Debug.Print "aleatorio: " & cifras & " = " & vbCrLf & ConvertirCifrasEnLetras(cifras, separadorGruposSeisCifras:=vbCrLf)
  502. End Sub
  503. Public Sub TEST_ConvertirNumeroEnLetras()
  504. Debug.Print TEST("-123,45 ; 2", ConvertirNumeroEnLetras("-123,45", 2), "menos ciento veintitrés con cuarenta y cinco")
  505. Debug.Print TEST("2.000,25 ; 3", ConvertirNumeroEnLetras("2.000,25", 3, "kilo", "gramo"), "dos mil kilos con doscientos cincuenta gramos")
  506. Debug.Print TEST("43,005 ; 3", ConvertirNumeroEnLetras("43,005", 3, "kilómetro", "metro"), "cuarenta y tres kilómetros con cinco metros")
  507. Debug.Print TEST("1.270,23 ; 2", ConvertirNumeroEnLetras("1.270,23", 2, "euro", "céntimo"), "mil doscientos setenta euros con veintitrés céntimos")
  508. Debug.Print TEST("1 ; 2", ConvertirNumeroEnLetras("1", 2, "euro", "céntimo"), "un euro con cero céntimos")
  509. Debug.Print TEST("0,678 ; 2", ConvertirNumeroEnLetras("0,678", 2, "euro", "céntimo"), "cero euros con sesenta y siete céntimos")
  510. Debug.Print TEST("22.000,55 ; 0", ConvertirNumeroEnLetras("22.000,55", 0, "euro"), "veintidós mil euros")
  511. Debug.Print TEST("-0 ;", ConvertirNumeroEnLetras("-0"), "cero")
  512. Debug.Print TEST("-0,01 ;", ConvertirNumeroEnLetras("-0,01"), "menos cero con uno")
  513. Debug.Print TEST("0,01 ; 3", ConvertirNumeroEnLetras("0,01", 3), "cero con diez")
  514. Debug.Print TEST("20,21 ;", ConvertirNumeroEnLetras("20,21"), "veinte con veintiuno")
  515. Debug.Print TEST("-,889 ;", ConvertirNumeroEnLetras("-,889"), "menos cero con ochocientos ochenta y nueve")
  516. Debug.Print TEST("0 ;", ConvertirNumeroEnLetras("0"), "cero")
  517. Debug.Print TEST("1,5 ; 2", ConvertirNumeroEnLetras("1,5", 2, "peseta", "céntimo", True), "una peseta con cincuenta céntimos")
  518. Debug.Print TEST("300,56 ; 3", ConvertirNumeroEnLetras("300,56", 3, "segundo", "milésima", False, True), "trescientos segundos con quinientas sesenta milésimas")
  519. Debug.Print TEST("21,21 ; 2", ConvertirNumeroEnLetras("21,21", 2, "niño", "niña", False, True), "veintiún niños con veintiuna niñas")
  520. Debug.Print TEST("1000000", ConvertirNumeroEnLetras("1000000", 0, "euro"), "un millón de euros")
  521. Debug.Print TEST("200200200", ConvertirNumeroEnLetras("200200200", 0, "persona", "", True), "doscientos millones doscientas mil doscientas personas")
  522. Debug.Print TEST("221.221.221", ConvertirNumeroEnLetras("221.221.221", 0, "persona", "", True), "doscientos veintiún millones doscientas veintiuna mil doscientas veintiuna personas")
  523. Debug.Print TEST("3120", ConvertirNumeroEnLetras("3120", 0, "persona", "", True), "tres mil ciento veinte personas")
  524. End Sub
  525.  
  526.  

Proinf.net