0% encontró este documento útil (0 votos)
168 vistas12 páginas

Conversión de Números a Letras

Este documento describe una función para convertir números a su forma escrita en palabras en español. Explica que la función puede manejar números enteros de hasta 126 dígitos y proporciona ejemplos de uso. También reconoce limitaciones de otras funciones similares y proporciona enlaces útiles. El autor intenta crear funciones breves, autodescriptivas y fáciles de probar para evitar errores comunes en conversión de números a texto.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
168 vistas12 páginas

Conversión de Números a Letras

Este documento describe una función para convertir números a su forma escrita en palabras en español. Explica que la función puede manejar números enteros de hasta 126 dígitos y proporciona ejemplos de uso. También reconoce limitaciones de otras funciones similares y proporciona enlaces útiles. El autor intenta crear funciones breves, autodescriptivas y fáciles de probar para evitar errores comunes en conversión de números a texto.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

'Option Compare Database

Option Explicit
'CifrasEnLetras
' Francisco Cascales <[email protected]>
'
'Uso:
' ConvertirEurosEnLetras(22.34) --> "veintids euros con treinta y
cuatro cntimos"
' ConvertirNumeroEnLetras("35,67") --> "treinta y cinco con sesenta y
siete"
'
'Descripcin:
' - Expresa un nmero entero en letra. Por ejemplo: convierte "22" en
"veintids"
' - El nmero puede ser de 1 hasta 126 cifras como mximo.
'
'Propsito:
' Mi propsito es que el cdigo no necesite comentarios para que sea
claro. Para ello intento crear
' una serie de rutinas breves, autodescriptivas, fciles de comprender,
mantener y probar por separado.
'
'Estado actual del tema en la Red:
' Funciones que conviertan cifras en letras hay muchas si buscamos en la
Red, pero en todas
' las que he probado haban errores:
'
- Acentuacin: poner "veintidos" sin acento.
'
- Negatividad: "-0" como "menos cero" en vez de "cero"
'
- Plurales.
'
- El cero.
'
- Espacios en blanco de ms.
'
- Palabras de ms: Expresar el nmero "10.001.000" como "diez
millones un mil" en vez de
'
por "diez millones mil" com debera ser.
'
'Enlaces tiles:
' - Lista de nmeros en la Wikipedia:
http://es.wikipedia.org/wiki/Anexo:Lista_de_n%C3%BAmeros
' - Signos matemticos en Encarta:
http://es.encarta.msn.com/encyclopedia_761577100/Signos_matem
%C3%A1ticos.html
' - "Nombres de los nmeros en espaol" en la Wikipedia
'
'Versiones:
' version 0.01, 8-dic-2007 - Inicio del proyecto
' version 0.02, 12-dic-2007 - Cifras en femenino
' version 0.04, 22-dic-2007 - Mltiplos de milln con preposicin "de"
antes del concepto:
'
"un milln de euros", "dos millones de
euros", "un milln mil un euros"
'
Las cifras superiores al milln siempre en
masculino.
'
"doscientos millones doscientas mil
personas"
Private Const PREFIJO_ERROR = "Error: "

Private Const COMA = ","


Private Const MENOS = "-"
Enum EnumGenero
neutro
Masculino
Femenino
End Enum
Public Function ListaUnidades(ByVal unidades As Integer, _
Optional ByVal genero As EnumGenero = neutro _
) As String
'Primeros treinta nmeros: Nmeros del cero al veintinueve
'Ejemplo: ListaUnidades(2) --> "dos"
If unidades = 1 And genero = Masculino Then
ListaUnidades = "uno"
ElseIf unidades = 1 And genero = Femenino Then
ListaUnidades = "una"
ElseIf unidades = 21 And genero = Masculino Then
ListaUnidades = "veintiuno"
ElseIf unidades = 21 And genero = Femenino Then
ListaUnidades = "veintiuna"
Else
ListaUnidades = Array("cero", "un", "dos", "tres", "cuatro",
"cinco", "seis", "siete", "ocho", "nueve", _
"diez", "once", "doce", "trece", "catorce", "quince",
"diecisis", "diecisiete", "dieciocho", "diecinueve", "veinte", _
"veintin", "veintids", "veintitrs", "veinticuatro",
"veinticinco", "veintisis", "veintisiete", "veintiocho", "veintinueve")
(unidades)
End If
End Function
Public Function ListaDecenas(ByVal decena As Integer) As String
'Ejemplo: ListaDecenas(2) --> "veinte"
ListaDecenas = Array("", "diez", "veinte", "treinta", "cuarenta",
"cincuenta", "sesenta", "setenta", "ochenta", "noventa")(decena)
End Function
Public Function ListaCentenas(ByVal centena As Integer, _
Optional ByVal genero As EnumGenero = neutro _
) As String
'Ejemplo: ListaCentenas(2) --> "doscientos"
ListaCentenas = Array("", "cien", "doscientos", "trescientos",
"cuatrocientos", "quinientos", "seiscientos", "setecientos",
"ochocientos", "novecientos")(centena)
If genero = Femenino Then ListaCentenas = Replace(ListaCentenas,
"iento", "ienta")
End Function
Public Function ListaOrdenesMillones(ByVal orden As Integer, ByVal
enPlural As Boolean) As String
'Ordenes de milln: 10^6, 10^12, 10^18, 10^24, ..., 10^120

'Ejemplo: ListaOrdenesMillones(2, enPlural:=false) --> "billn"


If enPlural = False Then
ListaOrdenesMillones = Array("", "milln", "billn", "trilln",
"cuatrilln", "quintilln", _
"sextilln", "septilln", "octilln", "nonilln", "decilln", _
"undecilln", "duodecilln", "tridecilln", "cuatridecilln",
"quidecilln", _
"sexdecilln", "septidecilln", "octodecilln", "nonidecilln",
"vigilln")(orden)
Else
ListaOrdenesMillones = Array("", "millones", "billones",
"trillones", "cuatrillones", "quintillones", _
"sextillones", "septillones", "octillones", "nonillones",
"decillones", _
"undecillones", "duodecillones", "tridecillones",
"cuatridecillones", "quidecillones", _
"sexdecillones", "septidecillones", "octodecillones",
"nonidecillones", "vigillones")(orden)
End If
End Function
Public Function ConvertirDosCifras(ByVal cifras As Integer, _
Optional ByVal genero As EnumGenero = neutro _
) As String
'Primer centenar: del cero al noventa y nueve
'Ejemplo: ConvertirDosCifras(22) --> "veintids"
Dim unidad As Integer: unidad = cifras Mod 10
Dim decena As Integer: decena = cifras \ 10
If cifras < 30 Then
ConvertirDosCifras = ListaUnidades(cifras, genero)
ElseIf unidad = 0 Then
ConvertirDosCifras = ListaDecenas(decena)
Else
ConvertirDosCifras = ListaDecenas(decena) & " y " &
ListaUnidades(unidad, genero)
End If
End Function
Public Function ConvertirTresCifras(ByVal cifras As Integer, _
Optional ByVal genero As EnumGenero = neutro _
) As String
'Primer millar: del cero al novecientos noventa y nueve
'Ejemplo: ConvertirTresCifras(222) --> "doscientos veintids"
Dim decenas_y_unidades As Integer: decenas_y_unidades = cifras Mod
100
Dim centenas As Integer: centenas = cifras \ 100
If cifras < 100 Then
ConvertirTresCifras = ConvertirDosCifras(cifras, genero)
ElseIf decenas_y_unidades = 0 Then
ConvertirTresCifras = ListaCentenas(centenas, genero)
ElseIf centenas = 1 Then
ConvertirTresCifras = "ciento " &
ConvertirDosCifras(decenas_y_unidades, genero)
Else
ConvertirTresCifras = ListaCentenas(centenas, genero) & " " &
ConvertirDosCifras(decenas_y_unidades, genero)
End If

End Function
Public Function ConvertirSeisCifras(ByVal cifras As Long, _
Optional ByVal genero As EnumGenero = neutro _
) As String
'Primer milln: del cero al novecientos noventa y nueve mil novecientos
noventa y nueve
'Ejemplo: ConvertirSeisCifras(222222) --> "doscientos veintids mil
doscientos veintids"
Dim primerMillar As Integer: primerMillar = cifras Mod 1000
Dim grupoMiles As Integer: grupoMiles = cifras \ 1000
Dim generoMiles As EnumGenero: generoMiles = IIf(genero = Masculino,
neutro, genero)
If grupoMiles = 0 Then
ConvertirSeisCifras = ConvertirTresCifras(primerMillar, genero)
ElseIf grupoMiles = 1 Then
If primerMillar = 0 Then
ConvertirSeisCifras = "mil"
Else
ConvertirSeisCifras = "mil " &
ConvertirTresCifras(primerMillar, genero)
End If
ElseIf primerMillar = 0 Then
ConvertirSeisCifras = ConvertirTresCifras(grupoMiles,
generoMiles) & " mil"
Else
ConvertirSeisCifras = ConvertirTresCifras(grupoMiles,
generoMiles) & " mil " & ConvertirTresCifras(primerMillar, genero)
End If
End Function
Public Function ConvertirCifrasEnLetras(ByVal cifras As String, _
Optional ByVal genero As EnumGenero = neutro, _
Optional ByVal separadorGruposSeisCifras As String = " " _
) As String
'Nmeros enteros entre el cero y el novecientos noventa y nueve mil
novecientos noventa y nueve vigillones... etc, etc.
'Es decir entre el 0 y el (10^126)-1
'o bien nmeros entre 1 y 126 cifras.
'Ejemplos:
' ConvertirCifrasEnLetras("22222222") --> "veintids millones doscientos
veintids mil doscientos veintids"
' ConvertirCifrasEnLetras("") --> "No hay ningn nmero"
' ConvertirCifrasEnLetras(string(127,"9")) --> "El nmero es demasiado
grande ya que tiene ms de 126 cifras"
' ConvertirCifrasEnLetras("0x") --> "Uno de los caracteres no es una
cifra decimal"
' ConvertirCifrasEnLetras(string(126,"9")) --> "novecientos noventa y
nueve mil novecientos noventa y nueve vigillones..."
' ConvertirCifrasEnLetras(10 ^ 6) --> "un milln"
' ConvertirCifrasEnLetras(10 ^ 12) --> "un billn"
' ConvertirCifrasEnLetras(10200050) --> "diez millones doscientos mil
cincuenta"
' ConvertirCifrasEnLetras(10001000) --> "diez millones mil"
' ConvertirCifrasEnLetras("1" & String(120, "0")) --> "un vigilln"
' ConvertirCifrasEnLetras ("2" & String(18, "0")) --> "dos trillones"

' ConvertirCifrasEnLetras("4792347927489", separadorGrupos:=vbCrLf) -->


"..."
' ConvertirCifrasEnletras("521201",True) --> "quinientas veintiuna mil
doscientas una"
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim

numeroCifras As Integer
indiceCifra As Integer
cifra As String * 1
numeroGruposSeisCifras As Integer
cerosIzquierda As String
indiceGrupo As Integer
ordenMillon As Integer
seisCifras As Long
letras As String
resultado As String

'Inicializacin
cifras = Trim(cifras)
numeroCifras = Len(cifras)
'Comprobacin
If numeroCifras = 0 Then
ConvertirCifrasEnLetras = PREFIJO_ERROR & "No hay ningn nmero"
Exit Function
End If
For indiceCifra = 1 To numeroCifras
cifra = Mid(cifras, indiceCifra, 1)
If InStr("0123456789", cifra) = 0 Then
ConvertirCifrasEnLetras = PREFIJO_ERROR & "Uno de los
caracteres no es una cifra decimal"
Exit Function
End If
Next
If numeroCifras > 126 Then
ConvertirCifrasEnLetras = PREFIJO_ERROR & "El nmero es demasiado
grande ya que tiene ms de 126 cifras"
Exit Function
End If
'Preparacin
numeroGruposSeisCifras = numeroCifras \ 6 + Sgn(numeroCifras Mod 6)
cerosIzquierda = String(numeroGruposSeisCifras * 6 - numeroCifras,

"0")

cifras = cerosIzquierda & cifras


ordenMillon = numeroGruposSeisCifras - 1
'Procesamiento
resultado = ""
For indiceGrupo = 0 To numeroGruposSeisCifras - 1
seisCifras = CLng(Mid(cifras, indiceGrupo * 6 + 1, 6))
If seisCifras <> 0 Then
If resultado <> "" Then resultado = resultado & " "
If ordenMillon = 0 Then
letras = ConvertirSeisCifras(seisCifras, genero)
ElseIf seisCifras = 1 Then

letras = "un " & ListaOrdenesMillones(ordenMillon,


enPlural:="false")
Else
letras = ConvertirSeisCifras(seisCifras, neutro) & " " &
ListaOrdenesMillones(ordenMillon, enPlural:="true")
End If
resultado = resultado & letras
End If
ordenMillon = ordenMillon - 1

Next

If resultado = "" Then resultado = ListaUnidades(0)


ConvertirCifrasEnLetras = resultado
End Function
Public Function DejarSoloCaracteresDeseados(ByVal texto As String, ByVal
caracteresDeseados As String) As String
'Ejemplos:
' DejarSoloCaracteresDeseados("89.500.400","0123456789") --> "89500400"
' DejarSoloCaracteresDeseados("ABC-000-123-X-456","0123456789") -->
"000123456"
Dim indice As Integer
Dim caracter As String * 1
indice = 1
Do Until indice > Len(texto)
caracter = Mid(texto, indice, 1)
If InStr(caracteresDeseados, caracter) = 0 Then
texto = Left(texto, indice - 1) & Mid(texto, indice + 1)
Else
indice = indice + 1
End If
Loop
DejarSoloCaracteresDeseados = texto
End Function
Public Function NumeroRepeticiones(ByVal texto As String, ByVal
caracteres As String) As Integer
'Ejemplos:
' NumeroRepeticiones("89.500.400","0") --> 4
Dim indice As Integer
Dim caracter As String * 1
NumeroRepeticiones = 0
For indice = 1 To Len(texto)
caracter = Mid(texto, indice, 1)
If InStr(caracteres, caracter) <> 0 Then
NumeroRepeticiones = NumeroRepeticiones + 1
End If
Next
End Function
Public Function ConvertirNumeroEnLetras(ByVal cifras As String, _
Optional ByVal numeroDecimales As Integer = -1, _

Optional ByVal palabraEnteraSingular As String = "", Optional ByVal


palabraDecimalSingular As String = "", _
Optional ByVal esFemeninaPalabraEntera As Boolean = False, Optional
ByVal esFemeninaPalabraDecimal As Boolean = False, _
Optional ByVal palabraEnteraPlural As String = "", Optional ByVal
palabraDecimalPlural As String = "" _
) As String
'Expresa un nmero con decimales y signo en letras
' acompaado del tipo de medida para la parte entera y la parte decimal
'Ejemplos:
' ConvertirNumeroEnLetras("-123,45",2) --> "menos ciento veintitrs con
cuarenta y cinco"
' ConvertirNumeroEnLetras("2.000,25", 3, "kilo","gramo") --> "dos mil
kilos con doscientos cincuenta gramos"
' ConvertirNumeroEnLetras("43,005", 3, "kilmetro","metro") -->
"cuarenta y tres kilmetros con cinco metros"
' ConvertirNumeroEnLetras("1.270,23", 2, "euro","cntimo") --> "mil
doscientos setenta euros con veintitrs cntimos"
' ConvertirNumeroEnLetras("1", 2, "euro","cntimo") --> "un euro con
cero cntimos"
' ConvertirNumeroEnLetras("0,678", 2, "euro","cntimo") --> "cero euros
con sesenta y siete cntimos"
' ConvertirNumeroEnLetras("22.000,55", 0, "euro") --> "veintids mil
euros"
' ConvertirNumeroEnLetras("-,889") --> "menos cero con ochocientos
ochenta y nueve"
' ConvertirNumeroEnLetras("1,5", 2, "peseta", "cntimo", True) --> "una
peseta con cincuenta cntimos"
' ConvertirNumeroEnLetras("300,56", 3, "segundo", "milsima", False,
True) --> "trescientos segundos con quinientas sesenta milsimas"
' ConvertirNumeroEnLetras("21,21",2,"nio","nia",false,true) -->
"veintin nios con veintiuna nias"
' ConvertirNumeroEnLetras(32,0,"camin",palabraEnteraPlural:="camiones")
--> "treinta y dos camiones"
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim

repeticionesComa As Integer, repeticionesMenos As Integer


cifrasEntera As String, cifrasDecimal As String
letrasEntera As String, letrasDecimal As String
palabraEntera As String, palabraDecimal As String
parteEntera As String, parteDecimal As String
posicionComa As Integer
cerosDerecha As String
esNegativo As Boolean
esAutomaticoDecimales As Boolean
esCero As Boolean
resultado As String

'Valores predeterminados
If palabraEnteraSingular <> "" And palabraEnteraPlural = "" Then
palabraEnteraPlural = palabraEnteraSingular & "s"
If palabraDecimalSingular <> "" And palabraDecimalPlural = "" Then
palabraDecimalPlural = palabraDecimalSingular & "s"
'Limpieza
cifras = DejarSoloCaracteresDeseados(cifras, "0123456789" & COMA &
MENOS)

'Comprobaciones
repeticionesMenos = NumeroRepeticiones(cifras, MENOS)
repeticionesComa = NumeroRepeticiones(cifras, COMA)
If repeticionesMenos > 1 Or (repeticionesMenos = 1 And Left(cifras,
1) <> MENOS) Then
ConvertirNumeroEnLetras = PREFIJO_ERROR & "Smbolo negativo
incorrecto o demasiados smbolos negativos"
Exit Function
ElseIf repeticionesComa > 1 Then
ConvertirNumeroEnLetras = PREFIJO_ERROR & "Demasiadas comas
decimales"
Exit Function
End If
'Negatividad
esNegativo = Left(cifras, 1) = MENOS
If esNegativo Then cifras = Mid(cifras, 2)
'Preparacin
posicionComa = InStr(cifras, COMA)
If posicionComa = 0 Then posicionComa = Len(cifras) + 1
cifrasEntera = Left(cifras, posicionComa - 1)
If cifrasEntera = "" Or cifrasEntera = MENOS Then cifrasEntera = "0"
cifrasDecimal = Mid(cifras, posicionComa + 1)
esAutomaticoDecimales = numeroDecimales < 0
If esAutomaticoDecimales Then
numeroDecimales = Len(cifrasDecimal)
Else
cifrasDecimal = Left(cifrasDecimal, numeroDecimales)
cerosDerecha = String(numeroDecimales - Len(cifrasDecimal), "0")
cifrasDecimal = cifrasDecimal & cerosDerecha
End If
'Cero
esCero = DejarSoloCaracteresDeseados(cifrasEntera, "123456789") = ""
And _
DejarSoloCaracteresDeseados(cifrasDecimal, "123456789") = ""
'Procesar
resultado = ""
If esNegativo And Not esCero Then resultado = "menos "
parteEntera = procesarEnLetras(cifrasEntera, palabraEnteraSingular,
palabraEnteraPlural, esFemeninaPalabraEntera)
If Left(parteEntera, Len(PREFIJO_ERROR)) = PREFIJO_ERROR Then
ConvertirNumeroEnLetras = parteEntera
Exit Function
End If
resultado = resultado & parteEntera
If cifrasDecimal <> "" Then
parteDecimal = procesarEnLetras(cifrasDecimal,
palabraDecimalSingular, palabraDecimalPlural, esFemeninaPalabraDecimal)

If Left(parteDecimal, Len(PREFIJO_ERROR)) = PREFIJO_ERROR Then


ConvertirNumeroEnLetras = parteDecimal
Exit Function
End If
resultado = resultado & " con " & parteDecimal
End If
ConvertirNumeroEnLetras = resultado
End Function
Private Function procesarEnLetras(ByVal cifras As String, _
ByVal palabraSingular As String, ByVal palabraplural As String, ByVal
esFemenina As Boolean _
) As String
' Funcin auxiliar de convertirNumeroEnLetras
' para procesar por separado la parte entera y la parte decimal
Dim
Dim
Dim
Dim
Dim
Dim
Dim

letras As String
genero As EnumGenero
esCero As Boolean
esUno As Boolean
esMultiploMillon As Boolean
palabra As String
resultado As String

'Gnero
genero = neutro
If esFemenina Then
genero = Femenino
ElseIf palabraSingular = "" Then
genero = Masculino
End If
'Letras
letras = ConvertirCifrasEnLetras(cifras, genero)
If Left(letras, Len(PREFIJO_ERROR)) = PREFIJO_ERROR Then
procesarEnLetras = letras
Exit Function
End If
'Propiedades
esCero = letras = "cero" Or letras = ""
esUno = letras = "un" Or letras = "una" Or letras = "uno"
esMultiploMillon = Not esCero And Right(cifras, 6) = "000000"
'Palabra
palabra = ""
If palabraSingular <> "" Then
If esUno Or palabraplural = "" Then
palabra = palabraSingular
Else
palabra = palabraplural
End If
End If
'Resultado

resultado = letras
If palabra <> "" Then
resultado = resultado & IIf(esMultiploMillon, " de ", " ") &
palabra
End If
procesarEnLetras = resultado
End Function
Public Function ConvertirEurosEnLetras(ByVal euros As Currency) As String
'Al ser de tipo Currency el intervalo es -922.337.203.685.477,5808 a
922.337.203.685.477,5807
Dim cifras As String
ConvertirEurosEnLetras = ConvertirNumeroEnLetras(Format(euros,
"0.00"), 2, "euro", "cntimo")
End Function
Private Function TEST(cifra, prueba, referencia) As String
TEST = IIf(prueba = referencia, "correcto", "ERROR") & ": " & cifra &
" = " & prueba
End Function
Public Sub TEST_ConvertirDosCifras()
Dim pruebas(): pruebas = Array(0, 1, 2, 7, 10, 12, 22, 30, 50, 66,
84, 99)
Dim referencias(): referencias = Array("cero", "un", "dos", "siete",
"diez", "doce", "veintids", "treinta", "cincuenta", "sesenta y seis",
"ochenta y cuatro", "noventa y nueve")
Dim indice As Integer
Dim cifras As Long
For indice = 0 To UBound(pruebas)
cifras = pruebas(indice)
Debug.Print TEST(cifras, ConvertirSeisCifras(cifras),
referencias(indice))
Next
Randomize
For indice = 0 To 10
cifras = Int(Rnd * 10 ^ 2)
Debug.Print "aleatorio: " & cifras & " = " &
ConvertirDosCifras(cifras)
Next
End Sub
Public Sub TEST_ConvertirTresCifras()
Dim pruebas(): pruebas = Array(44, 300, 100, 121, 438, 999)
Dim referencias(): referencias = Array("cuarenta y cuatro",
"trescientos", "cien", "ciento veintin", "cuatrocientos treinta y ocho",
"novecientos noventa y nueve")
Dim indice As Integer
Dim cifras As Long
For indice = 0 To UBound(pruebas)
cifras = pruebas(indice)
Debug.Print TEST(cifras, ConvertirTresCifras(cifras),
referencias(indice))
Next
Randomize
For indice = 0 To 10
cifras = Int(Rnd * 10 ^ Int(Rnd * 4))

Debug.Print "aleatorio: " & cifras & " = " &


ConvertirTresCifras(cifras)
Next
End Sub
Public Sub TEST_ConvertirSeisCifras()
Dim pruebas(): pruebas = Array(781, 1000, 1001, 1200, 320000, 458926,
999999)
Dim referencias(): referencias = Array("setecientos ochenta y un",
"mil", "mil un", "mil doscientos", "trescientos veinte mil",
"cuatrocientos cincuenta y ocho mil novecientos veintisis", "novecientos
noventa y nueve mil novecientos noventa y nueve")
Dim indice As Integer
Dim cifras As Long
For indice = 0 To UBound(pruebas)
cifras = pruebas(indice)
Debug.Print TEST(cifras, ConvertirSeisCifras(cifras),
referencias(indice))
Next
Randomize
For indice = 0 To 10
cifras = Int(Rnd * 10 ^ Int(Rnd * 7))
Debug.Print "aleatorio: " & cifras & " = " &
ConvertirSeisCifras(cifras)
Next
End Sub
Public Sub TEST_ConvertirCifrasEnLetras()
Dim cifras As String
Dim indice As Integer
Randomize
For indice = 1 To Int(Rnd * 126) + 1
cifras = cifras & Mid("0123456789", Int(Rnd * 10) + 1, 1)
Next
Debug.Print "aleatorio: " & cifras & " = " & vbCrLf &
ConvertirCifrasEnLetras(cifras, separadorGruposSeisCifras:=vbCrLf)
End Sub
Public Sub TEST_ConvertirNumeroEnLetras()
Debug.Print TEST("-123,45 ; 2", ConvertirNumeroEnLetras("-123,45",
2), "menos ciento veintitrs con cuarenta y cinco")
Debug.Print TEST("2.000,25 ; 3", ConvertirNumeroEnLetras("2.000,25",
3, "kilo", "gramo"), "dos mil kilos con doscientos cincuenta gramos")
Debug.Print TEST("43,005 ; 3", ConvertirNumeroEnLetras("43,005", 3,
"kilmetro", "metro"), "cuarenta y tres kilmetros con cinco metros")
Debug.Print TEST("1.270,23 ; 2", ConvertirNumeroEnLetras("1.270,23",
2, "euro", "cntimo"), "mil doscientos setenta euros con veintitrs
cntimos")
Debug.Print TEST("1 ; 2", ConvertirNumeroEnLetras("1", 2, "euro",
"cntimo"), "un euro con cero cntimos")
Debug.Print TEST("0,678 ; 2", ConvertirNumeroEnLetras("0,678", 2,
"euro", "cntimo"), "cero euros con sesenta y siete cntimos")
Debug.Print TEST("22.000,55 ; 0",
ConvertirNumeroEnLetras("22.000,55", 0, "euro"), "veintids mil euros")
Debug.Print TEST("-0 ;", ConvertirNumeroEnLetras("-0"), "cero")
Debug.Print TEST("-0,01 ;", ConvertirNumeroEnLetras("-0,01"), "menos
cero con uno")
Debug.Print TEST("0,01 ; 3", ConvertirNumeroEnLetras("0,01", 3),
"cero con diez")

Debug.Print TEST("20,21 ;", ConvertirNumeroEnLetras("20,21"), "veinte


con veintiuno")
Debug.Print TEST("-,889 ;", ConvertirNumeroEnLetras("-,889"), "menos
cero con ochocientos ochenta y nueve")
Debug.Print TEST("0 ;", ConvertirNumeroEnLetras("0"), "cero")
Debug.Print TEST("1,5 ; 2", ConvertirNumeroEnLetras("1,5", 2,
"peseta", "cntimo", True), "una peseta con cincuenta cntimos")
Debug.Print TEST("300,56 ; 3", ConvertirNumeroEnLetras("300,56", 3,
"segundo", "milsima", False, True), "trescientos segundos con quinientas
sesenta milsimas")
Debug.Print TEST("21,21 ; 2", ConvertirNumeroEnLetras("21,21", 2,
"nio", "nia", False, True), "veintin nios con veintiuna nias")
Debug.Print TEST("1000000", ConvertirNumeroEnLetras("1000000", 0,
"euro"), "un milln de euros")
Debug.Print TEST("200200200", ConvertirNumeroEnLetras("200200200", 0,
"persona", "", True), "doscientos millones doscientas mil doscientas
personas")
Debug.Print TEST("221.221.221",
ConvertirNumeroEnLetras("221.221.221", 0, "persona", "", True),
"doscientos veintin millones doscientas veintiuna mil doscientas
veintiuna personas")
Debug.Print TEST("3120", ConvertirNumeroEnLetras("3120", 0,
"persona", "", True), "tres mil ciento veinte personas")
End Sub

También podría gustarte