Convertir importes a letras en Crystal Report
En Crystal Report podemos realizar una función para convertir los número a letras, para ello crearemos una función personalizada mediante los siguientes pasos:
1. En el taller de fórmulas de Crystal Report se deben crear dos funciones personalizadas (NumeroALetras y NumerosALetras):

3. Posteriormente crearemos una fórmula (por ejemplo ImporteALetras) que haga referencia a la función creada, donde le pasaremos como parámetro un campo, fórmula o un número que contenga el importe y dicha fórmula devolverá una expresión con el importe en letras. En el siguiente ejemplo se convierte un importe monetario en letras incluyendo la moneda.

' número a convertir
dim numero as number
numero = 0
formula = ""
if numero < 0 then
numero = abs(numero)
formula = "MENOS "
end if
' parte entera
dim entero as number
entero = truncate(numero)
formula = formula & NumerosALetras(entero)
formula = formula & " EUROS"
' parte decimal
dim decimales as number
decimales = Round((numero - entero) * 100, 2)
if decimales > 0 then
formula = formula & " CON " & NumerosALetras(decimales)
formula = formula & " CENTIMOS"
end if
4. Por último, diseñaremos el informe insertando la fórmula en la posición que deseemos.


Funciones personalizadas de Crystal Report
Function NumeroALetras(numero As number) As String
Dim text As String
Dim value As number
value = Truncate(numero)
If value = 0 Then
text = "CERO"
ElseIf value = 1 Then
text = "UN"
ElseIf value = 2 Then
text = "DOS"
ElseIf value = 3 Then
text = "TRES"
ElseIf value = 4 Then
text = "CUATRO"
ElseIf value = 5 Then
text = "CINCO"
ElseIf value = 6 Then
text = "SEIS"
ElseIf value = 7 Then
text = "SIETE"
ElseIf value = 8 Then
text = "OCHO"
ElseIf value = 9 Then
text = "NUEVE"
ElseIf value = 10 Then
text = "DIEZ"
ElseIf value = 11 Then
text = "ONCE"
ElseIf value = 12 Then
text = "DOCE"
ElseIf value = 13 Then
text = "TRECE"
ElseIf value = 14 Then
text = "CATORCE"
ElseIf value = 15 Then
text = "QUINCE"
ElseIf value < 20 Then
text = "DIECI" & "#" & ToText(value - 10,0) & "#"
ElseIf value = 20 Then
text = "VEINTE"
ElseIf value < 30 Then
text = "VEINTI" & "#" & ToText(value - 20,0) & "#"
ElseIf value = 30 Then
text = "TREINTA"
ElseIf value < 40 Then
text = "TREINTA Y " & "#" & ToText(value - 30,0) & "#"
ElseIf value = 40 Then
text = "CUARENTA"
ElseIf value < 50 Then
text = "CUARENTA Y " & "#" & ToText(value - 40,0) & "#"
ElseIf value = 50 Then
text = "CINCUENTA"
ElseIf value < 60 Then
text = "CINCUENTA Y " & "#" & ToText(value - 50,0) & "#"
ElseIf value = 60 Then
text = "SESENTA"
ElseIf value < 70 Then
text = "SESENTA Y " & "#" & ToText(value - 60,0) & "#"
ElseIf value = 70 Then
text = "SETENTA"
ElseIf value < 80 Then
text = "SETENTA Y " & "#" & ToText(value - 70,0) & "#"
ElseIf value = 80 Then
text = "OCHENTA"
ElseIf value < 90 Then
text = "OCHENTA Y " & "#" & ToText(value - 80,0) & "#"
ElseIf value = 90 Then
text = "NOVENTA"
ElseIf value < 100 Then
text = "NOVENTA Y " & "#" & ToText(value - 90,0) & "#"
ElseIf value = 100 Then
text = "CIEN"
ElseIf value < 200 Then
text = "CIENTO " & "#" & ToText(value - 100,0) & "#"
ElseIf value = 200 Then
text = "DOSCIENTOS"
ElseIf value = 300 Then
text = "TRESCIENTOS"
ElseIf value = 400 Then
text = "CUATROCIENTOS"
ElseIf value = 500 Then
text = "QUINIENTOS"
ElseIf value = 600 Then
text = "SEISCIENTOS"
ElseIf value = 700 Then
text = "SETECIENTOS"
ElseIf value = 800 Then
text = "OCHOCIENTOS"
ElseIf value = 900 Then
text = "NOVECIENTOS"
ElseIf value < 1000 Then
text = "#" & ToText(Truncate(value / 100) * 100,0) & "# #" & ToText(value Mod 100,0) & "#"
ElseIf value = 1000 Then
text = "MIL"
ElseIf value < 2000 Then
text = "MIL #" & ToText(value Mod 1000,0) & "#"
ElseIf value < 1000000 Then
text = "#" & ToText(Truncate(value / 1000),0) & "# MIL"
If (value Mod 1000) > 0 Then text = text & " #" & ToText(value Mod 1000,0) & "#"
ElseIf value = 1000000 Then
text = "UN MILLÓN"
ElseIf value < 2000000 Then
text = "UN MILLÓN #" & ToText(value Mod 1000000,0) & "#"
Else
text = "#" & ToText(Truncate(value / 1000000),0) & "# MILLONES"
If (value Mod 1000000) > 0 Then text = text & " #" & ToText(value Mod 1000000,0) & "#"
End If
NumeroALetras = text
End Function
Function NumerosALetras (numero As number) As String
Dim texto As String
Dim numTexto As String
Dim numLetras As String
Dim posInicial As Number
Dim posFinal As Number
texto = "#" & ToText(Truncate(numero),0) & "#"
Do While InStr(texto, "#") > 0
posInicial = InStr(texto, "#")+1
posFinal = InStr(posInicial, texto, "#")
If posFinal > 0 Then
numTexto = Mid(texto, posInicial, posFinal - posInicial)
numLetras = NumeroALetras(ToNumber(numTexto))
texto = Replace(texto, "#" & numTexto & "#", numLetras)
Else
Exit Do
End If
Loop
NumerosALetras = texto
End Function
Nota: si se utiliza otro nombre de función entonces es necesario cambiarlo en todo el código fuente.