Sei sulla pagina 1di 4

Funcin numeros a letras

Un poco de historia; esta funcin es una de las ms recurridas en la mayora de los lenguajes de programacin, a casi
todos los programadores, en algn momento nos sirve o nos la solicitan, esta funcin hace la utilsima tarea de
mostrar un valor numrico en su equivalente en texto o palabras, a lo largo de mi andar por la red, he visto ms de
media docena de versiones de esta funcin, cada una con sus pros y sus contras, tanto como esta, nuestra versin, y
dijo nuestra por que el algoritmo que uso no es original mo, sino de un amigo que se llama Samuel Monjaraz,
experto en el estupendo Clipper y ahora en Visual Fox, de hecho la primer versin en Basic tambin el la hizo, mi
tarea solo ha sido hacerle unos ajustes y darla a conocer, la primer versin ya tiene muchos aos, no recuerdo
cuantos y a lo largo de estos, la he proporcionado por la mayora de los lugares donde a sido posible, tal vez hasta la
tengas y no sepas de quien es, a algunos usuarios no les gusta mantener los crditos, pero en la mayora de los casos,
los algoritmos son claramente diferenciables y el de mi amigo me gusta mucho, en la Pgina del Guille, tiene una
muy buena versin, es ms completa que esta, pues le puedes decir el nombre de la moneda, si es femenina o
masculina, el nombre de los cntimos entre otras moneras.
En los aos que llevo programando, nunca he usado otra moneda ni otro formato ms que el de Mxico, si tu eres
internacional y usas varias monedas, te felicito y te recomiendo usar la versin del Guille, pero si tan solo usas tu
moneda local, te recomiendo adaptar esta versin, de hecho, me gustara compilar en esta pgina, las versiones de
diferentes pases, as que si en tu pas se usa otro estilo y moneda, me dices como es y la agregamos a esta pgina...
En Mxico, los nmeros en letras los mostramos en el siguiente formato:
12,345.67 (DOCE MIL TRESCIENTOS CUARENTA Y CINCO PESOS 67/100 M.N.)
Option Explicit
'Mauricio Baeza
mbs@inbox.net
'Samuel Monajaras
smonjaraz@hotmail.com
'Enero-97
'http://www.vbalym.netfirms.com
'Argumentos:
'Numero = Valor que deseamos convertir en texto
'Estilo = Formato de salida
'
1 = MAYUSCULAS
'
2 = minusculas
'
3 = Tipo Titulo
'Los valores negativos los convierte a positivos
'El valor minimo en 0, el valor maximo es 9,999,999,999,999.99
Public Function NumLetras(ByVal Numero As Double, ByVal Estilo As Integer) As
String
Dim NumTmp As String
Dim c01 As Integer
Dim c02 As Integer
Dim pos As Integer
Dim dig As Integer
Dim cen As Integer
Dim dec As Integer
Dim uni As Integer
Dim letra1 As String
Dim letra2 As String
Dim letra3 As String
Dim Leyenda As String
Dim Leyenda1 As String
Dim TFNumero As String
If Numero < 0 Then Numero = Abs(Numero)
NumTmp = Format(Numero, "000000000000000.00")
c01 = 1
pos = 1
TFNumero = ""
'Para extraer tres digitos cada vez
Do While c01 <= 5
c02 = 1
Do While c02 <= 3

'Le da un formato fijo

'Extrae un digito cada vez de izquierda a derecha


dig = Val(Mid(NumTmp, pos, 1))
Select Case c02
Case 1: cen = dig
Case 2: dec = dig
Case 3: uni = dig
End Select
c02 = c02 + 1
pos = pos + 1
Loop
letra3 = Centena(uni, dec, cen)
letra2 = Decena(uni, dec)
letra1 = Unidad(uni, dec)
Select Case c01
Case 1
If cen + dec + uni = 1 Then
Leyenda = "Billon "
ElseIf cen + dec + uni > 1 Then
Leyenda = "Billones "
End If
Case 2
If cen + dec + uni >= 1 And Val(Mid(NumTmp, 7, 3)) = 0 Then
Leyenda = "Mil Millones "
ElseIf cen + dec + uni >= 1 Then
Leyenda = "Mil "
End If
Case 3
If cen + dec = 0 And uni = 1 Then
Leyenda = "Millon "
ElseIf cen > 0 Or dec > 0 Or uni > 1 Then
Leyenda = "Millones "
End If
Case 4
If cen + dec + uni >= 1 Then
Leyenda = "Mil "
End If
Case 5
If cen + dec + uni >= 1 Then
Leyenda = ""
End If
End Select
c01 = c01 + 1
TFNumero = TFNumero + letra3 + letra2 + letra1 + Leyenda
Leyenda = ""
letra1 = ""
letra2 = ""
letra3 = ""

Loop

If Val(NumTmp) = 0 Or Val(NumTmp) < 1 Then


Leyenda1 = "Cero Pesos "
ElseIf Val(NumTmp) = 1 Or Val(NumTmp) < 2 Then
Leyenda1 = "Peso "
ElseIf Val(Mid(NumTmp, 4, 12)) = 0 Or Val(Mid(NumTmp, 10, 6)) = 0 Then
Leyenda1 = "de Pesos "
Else
Leyenda1 = "Pesos "
End If

'***************************************************************
'Nota: la funcion StrConv solo funciona en Excel2000 en adelante
TFNumero = TFNumero & Leyenda1
Select Case Estilo
Case 1
TFNumero = StrConv(TFNumero, vbUpperCase)
Case 2
TFNumero = StrConv(TFNumero, vbLowerCase)
Case Else
TFNumero = StrConv(TFNumero, vbProperCase)
End Select
TFNumero = "(" & TFNumero & Mid(NumTmp, 17) & "/100 M.N.)"
NumLetras = TFNumero
End Function
Private Function Centena(ByVal uni As Integer, ByVal dec As Integer, _
ByVal cen As Integer) As String
Dim cTexto As String
Select Case cen
Case 1
If dec + uni = 0 Then
cTexto = "cien "
Else
cTexto = "ciento "
End If
Case 2: cTexto = "doscientos "
Case 3: cTexto = "trescientos "
Case 4: cTexto = "cuatrocientos "
Case 5: cTexto = "quinientos "
Case 6: cTexto = "seiscientos "
Case 7: cTexto = "setecientos "
Case 8: cTexto = "ochocientos "
Case 9: cTexto = "novecientos "
Case Else: cTexto = ""
End Select
Centena = cTexto
End Function
Private Function Decena(ByVal uni As Integer, ByVal dec As Integer) As String
Dim cTexto As String
Select Case dec
Case 1:
Select Case uni
Case 0: cTexto = "diez "
Case 1: cTexto = "once "
Case 2: cTexto = "doce "
Case 3: cTexto = "trece "
Case 4: cTexto = "catorce "
Case 5: cTexto = "quince "
Case 6 To 9: cTexto = "dieci"
End Select
Case 2:
If uni = 0 Then
cTexto = "veinte "
ElseIf uni > 0 Then
cTexto = "veinti"

End If
Case 3: cTexto = "treinta "
Case 4: cTexto = "cuarenta "
Case 5: cTexto = "cincuenta "
Case 6: cTexto = "sesenta "
Case 7: cTexto = "setenta "
Case 8: cTexto = "ochenta "
Case 9: cTexto = "noventa "
Case Else: cTexto = ""
End Select
If uni > 0 And dec > 2 Then cTexto = cTexto + "y "
Decena = cTexto
End Function
Private Function Unidad(ByVal uni As Integer, ByVal dec As Integer) As String
Dim cTexto As String
If dec <> 1 Then
Select Case uni
Case 1: cTexto
Case 2: cTexto
Case 3: cTexto
Case 4: cTexto
Case 5: cTexto
End Select
End If
Select Case uni
Case 6: cTexto =
Case 7: cTexto =
Case 8: cTexto =
Case 9: cTexto =
End Select

=
=
=
=
=

"un "
"dos "
"tres "
"cuatro "
"cinco "

"seis "
"siete "
"ocho "
"nueve "

Unidad = cTexto
End Function
Recuerda que en la Introduccin, hay una explicacin de como usar cualquier macro o funcin que veas aqu,
adems para los que estn dados de alta en la lista de correo, en la pgina de eListas, tienen acceso al rea de
archivos, en donde pueden descargar este mdulo.
Agregue una nota acerca de los usuarios de Excel97, se refiere al uso de la funcin StrConv que solo funciona en el
Excel2000 en adelante, si este es tu caso, sustituye donde corresponda, con el siguiente cdigo, en el cdigo
descargable tambin esta la nota
'***************************************************************
'Nota: la funcion StrConv solo funciona en Excel2000 en adelante
'si es tu caso, usa el siguiente codigo
TFNumero = TFNumero & Leyenda1
Select Case Estilo
Case 1
TFNumero = UCase(TFNumero)
Case 2
TFNumero = LCase(TFNumero)
Case Else
TFNumero = Application.WorksheetFunction.Proper(TFNumero)
End Select
Descargar el cdigo de este artculo.

Potrebbero piacerti anche