Un aporte más que una consulta.
Estimado, soy Gustavo, de Argentina; en primer lugar lo felicito por su dedicación a la "enseñanza" gratuita; si bien en cierta medida, el reconocimiento general (de los usuarios de todoexpertos) es muy gratificante, pero lo suyo, y otros expertos, es muy elogiable.
Soy un usuario avezado (no avanzado!. Je je) de Excel y sus macros y rutinas en VB. Ahora estoy incursionando en MsAcces, y como para ir "adquiriendo" conocimientos me puse en contacto con todoexpertos, y obviamente recalé en vuestra sección de respuestas. Ahí me encontré con una rutina de conversión de Monedas (euros, $, etc.) a Texto. Excelente!
Pero, siempre hay un pero, encontré unas cosillas que me eran menester pulir en esa rutina.
Espero que no lo tome como una crítica, sino más bien como un humilde aporte, del cuál quizás otras personas puedan hacer uso. A continuación adjunto la misma, donde "recuadrado" entre asteriscos están mis agregados modificaciones.
Las mismas surgieron porque, es de uso frecuente, al menos acá, expresar las cifras de las decenas del 20, con "veinti---", p.e. 21 como "veintiun" y no "veinte y uno", etc.
Luego modifiqué el número "uno" por "un", queda más acorde en todos sus usos.
Cuando una cifra tal como p.e. 508 se traducía a letras, quedaba como "quinientos y ocho", usamos únicamente la expresión "quinientos ocho".
La expresión "ciento" carecía por delante de un blanco, por lo que quedaba pegada al texto anterior.
Si la cifra es cero (0), igualmente debe expresar "cero pesos".
La cifra "21.010.222.122" era traducida como "veintiún mil millones diez millones doscientos veintidós mil ciento veintidós pesos", sin embargo la forma correcta es veintiún mil diez millones doscientos veintidós mil ciento veintidós pesos"
Bien, me despido de Ud. Agradeciéndole una vez más todos sus esfuerzos.
Un cálido saludo.
Gustavo.
PD: es muy posible que algunas modificaciones mías, no sean criteriosas, "pero funcionan", si es así, por favor házmelo saber.
Option Compare Database
Option Explicit
Const ct_separador_decimal = ","
Public Function NumerosEurosALetras(ByVal NumberStr As String, Optional lFemenino = False, Optional cMoneda = "peso", Optional cCentimos = "centavo") As String
Dim nTemp, nDecimales
nTemp = InStr(NumberStr, ct_separador_decimal)
If nTemp = 0 Then
NumerosEurosALetras = NumerosALetras(NumberStr, lFemenino, cMoneda)
Else
nDecimales = Len(Mid(NumberStr, nTemp + 1))
Select Case nDecimales
Case 0
NumerosEurosALetras = NumerosALetras(NumberStr, lFemenino, cMoneda)
Case 1, 2 'centimos'
If nDecimales = 1 Then
NumberStr = NumberStr & "0"
End If
NumerosEurosALetras = NumerosALetras(Left(NumberStr, nTemp - 1), lFemenino, cMoneda) & " con" & _
NumerosALetras(Mid(NumberStr, nTemp + 1), lFemenino, cCentimos)
Case Else
NumerosEurosALetras = NumerosALetras(Left(NumberStr, nTemp - 1), False) & " coma " & _
NumerosALetras(Mid(NumberStr, nTemp + 1), False) & " " & cMoneda & _
IIf(InStr("aeio", Right(cMoneda, 1)) = 0, "e", "") & "s"
End Select
End If
End Function
Public Function NumerosALetras(ByVal NumberStr As String, Optional lFemenino = True, Optional cMoneda = "") As String
Dim z As String, x As String, Temp As String, c As String
Dim a As Integer, b As Integer, i As Integer
Dim iPos As Integer
Dim data(9, 3) As String
data(0, 0) = "un"
data(1, 0) = "dos"
data(2, 0) = "tres"
data(3, 0) = "cuatro"
data(4, 0) = "cinco"
data(5, 0) = "seis"
data(6, 0) = "siete"
data(7, 0) = "ocho"
data(8, 0) = "nueve"
data(9, 0) = "diez"
data(0, 1) = "cien"
data(1, 1) = "diez"
data(2, 1) = "veinte"
data(3, 1) = "treinta"
data(4, 1) = "cuarenta"
data(5, 1) = "cincuenta"
data(6, 1) = "sesenta"
data(7, 1) = "setenta"
data(8, 1) = "ochenta"
data(9, 1) = "noventa"
'***********************************************************************************
data(2, 2) = "veinti"
'***********************************************************************************
data(0, 3) = "diez"
data(1, 3) = "once"
data(2, 3) = "doce"
data(3, 3) = "trece"
data(4, 3) = "catorce"
data(5, 3) = "quince"
data(6, 3) = "dieciséis"
data(7, 3) = "diecisiete"
data(8, 3) = "dieciocho"
data(9, 3) = "diecinueve"
'remove redundant spaces
'NumberStr = Trim( Replace(NumberStr, ",", ""))
NumberStr = Trim(NumberStr)
a = Len(NumberStr)
Temp = NumberStr
If Val(NumberStr) = 0 Then
'***********************************************************************************
NumerosALetras = "cero pesos"
'***********************************************************************************
Exit Function
End If
'get rid of any decimals
iPos = InStr(Temp, ct_separador_decimal)
If iPos > 0 Then Temp = Left(Temp, iPos - 1)
While ((a Mod 3) <> 0)
Temp = "0" & Temp
a = Len(Temp)
Wend
NumberStr = Temp
For i = a - 2 To 1 Step -3
b = b + 1
Temp = Mid(NumberStr, i, 3)
z = ""
' "Intelligent" routines
'------------------------
If Temp <> "000" Then
If Temp = "100" Then
z = "cien"
Else
c = Left(Temp, 1)
If c <> "0" Then
If c = "1" Then
'***********************************************************************************
z = " ciento"
'***********************************************************************************
ElseIf c = "5" Then
z = " quinientos"
ElseIf c = "7" Then
z = " setecientos"
ElseIf c = "9" Then
z = " novecientos"
Else
z = " " & data(Val(c) - 1, 0) & "cientos"
End If
End If
c = Mid(Temp, 2, 1)
c =...
Soy un usuario avezado (no avanzado!. Je je) de Excel y sus macros y rutinas en VB. Ahora estoy incursionando en MsAcces, y como para ir "adquiriendo" conocimientos me puse en contacto con todoexpertos, y obviamente recalé en vuestra sección de respuestas. Ahí me encontré con una rutina de conversión de Monedas (euros, $, etc.) a Texto. Excelente!
Pero, siempre hay un pero, encontré unas cosillas que me eran menester pulir en esa rutina.
Espero que no lo tome como una crítica, sino más bien como un humilde aporte, del cuál quizás otras personas puedan hacer uso. A continuación adjunto la misma, donde "recuadrado" entre asteriscos están mis agregados modificaciones.
Las mismas surgieron porque, es de uso frecuente, al menos acá, expresar las cifras de las decenas del 20, con "veinti---", p.e. 21 como "veintiun" y no "veinte y uno", etc.
Luego modifiqué el número "uno" por "un", queda más acorde en todos sus usos.
Cuando una cifra tal como p.e. 508 se traducía a letras, quedaba como "quinientos y ocho", usamos únicamente la expresión "quinientos ocho".
La expresión "ciento" carecía por delante de un blanco, por lo que quedaba pegada al texto anterior.
Si la cifra es cero (0), igualmente debe expresar "cero pesos".
La cifra "21.010.222.122" era traducida como "veintiún mil millones diez millones doscientos veintidós mil ciento veintidós pesos", sin embargo la forma correcta es veintiún mil diez millones doscientos veintidós mil ciento veintidós pesos"
Bien, me despido de Ud. Agradeciéndole una vez más todos sus esfuerzos.
Un cálido saludo.
Gustavo.
PD: es muy posible que algunas modificaciones mías, no sean criteriosas, "pero funcionan", si es así, por favor házmelo saber.
Option Compare Database
Option Explicit
Const ct_separador_decimal = ","
Public Function NumerosEurosALetras(ByVal NumberStr As String, Optional lFemenino = False, Optional cMoneda = "peso", Optional cCentimos = "centavo") As String
Dim nTemp, nDecimales
nTemp = InStr(NumberStr, ct_separador_decimal)
If nTemp = 0 Then
NumerosEurosALetras = NumerosALetras(NumberStr, lFemenino, cMoneda)
Else
nDecimales = Len(Mid(NumberStr, nTemp + 1))
Select Case nDecimales
Case 0
NumerosEurosALetras = NumerosALetras(NumberStr, lFemenino, cMoneda)
Case 1, 2 'centimos'
If nDecimales = 1 Then
NumberStr = NumberStr & "0"
End If
NumerosEurosALetras = NumerosALetras(Left(NumberStr, nTemp - 1), lFemenino, cMoneda) & " con" & _
NumerosALetras(Mid(NumberStr, nTemp + 1), lFemenino, cCentimos)
Case Else
NumerosEurosALetras = NumerosALetras(Left(NumberStr, nTemp - 1), False) & " coma " & _
NumerosALetras(Mid(NumberStr, nTemp + 1), False) & " " & cMoneda & _
IIf(InStr("aeio", Right(cMoneda, 1)) = 0, "e", "") & "s"
End Select
End If
End Function
Public Function NumerosALetras(ByVal NumberStr As String, Optional lFemenino = True, Optional cMoneda = "") As String
Dim z As String, x As String, Temp As String, c As String
Dim a As Integer, b As Integer, i As Integer
Dim iPos As Integer
Dim data(9, 3) As String
data(0, 0) = "un"
data(1, 0) = "dos"
data(2, 0) = "tres"
data(3, 0) = "cuatro"
data(4, 0) = "cinco"
data(5, 0) = "seis"
data(6, 0) = "siete"
data(7, 0) = "ocho"
data(8, 0) = "nueve"
data(9, 0) = "diez"
data(0, 1) = "cien"
data(1, 1) = "diez"
data(2, 1) = "veinte"
data(3, 1) = "treinta"
data(4, 1) = "cuarenta"
data(5, 1) = "cincuenta"
data(6, 1) = "sesenta"
data(7, 1) = "setenta"
data(8, 1) = "ochenta"
data(9, 1) = "noventa"
'***********************************************************************************
data(2, 2) = "veinti"
'***********************************************************************************
data(0, 3) = "diez"
data(1, 3) = "once"
data(2, 3) = "doce"
data(3, 3) = "trece"
data(4, 3) = "catorce"
data(5, 3) = "quince"
data(6, 3) = "dieciséis"
data(7, 3) = "diecisiete"
data(8, 3) = "dieciocho"
data(9, 3) = "diecinueve"
'remove redundant spaces
'NumberStr = Trim( Replace(NumberStr, ",", ""))
NumberStr = Trim(NumberStr)
a = Len(NumberStr)
Temp = NumberStr
If Val(NumberStr) = 0 Then
'***********************************************************************************
NumerosALetras = "cero pesos"
'***********************************************************************************
Exit Function
End If
'get rid of any decimals
iPos = InStr(Temp, ct_separador_decimal)
If iPos > 0 Then Temp = Left(Temp, iPos - 1)
While ((a Mod 3) <> 0)
Temp = "0" & Temp
a = Len(Temp)
Wend
NumberStr = Temp
For i = a - 2 To 1 Step -3
b = b + 1
Temp = Mid(NumberStr, i, 3)
z = ""
' "Intelligent" routines
'------------------------
If Temp <> "000" Then
If Temp = "100" Then
z = "cien"
Else
c = Left(Temp, 1)
If c <> "0" Then
If c = "1" Then
'***********************************************************************************
z = " ciento"
'***********************************************************************************
ElseIf c = "5" Then
z = " quinientos"
ElseIf c = "7" Then
z = " setecientos"
ElseIf c = "9" Then
z = " novecientos"
Else
z = " " & data(Val(c) - 1, 0) & "cientos"
End If
End If
c = Mid(Temp, 2, 1)
c =...
1 Respuesta
Respuesta de rgsnipper
1