Hola.
Tendra alguien alguna funcion que convierta numeros a letras, ejemplo 934 en novescientos treinta y cuatro
creare il proprio.
Comparto codigo, es una funcion
Anduvo de lujo, suerte
func numeroaletra(n as string) as string
Dim b, paso As Integer
Dim expresion, entero, deci, flag As String
dim enletras as string
flag = “N”
For paso = 1 To Len(numero)
If Mid(numero, paso, 1) = “.” Then
flag = “S”
Else
If flag = “N” Then
entero = entero + Mid(numero, paso, 1) 'Extae la parte entera del numero
Else
deci = deci + Mid(numero, paso, 1) 'Extrae la parte decimal del numero
End If
End If
Next paso
If Len(deci) = 1 Then
deci = deci + “0”
End If
flag = “N”
If Val(numero) >= -999999999 And Val(numero) <= 999999999 Then 'si el numero esta dentro de 0 a 999.999.999
For paso = Len(entero) To 1 Step -1
b = Len(entero) - (paso - 1)
Select Case paso
Case 3, 6, 9
Select Case Mid(entero, b, 1)
Case “1”
If Mid(entero, b + 1, 1) = “0” And Mid(entero, b + 2, 1) = “0” Then
expresion = expresion + "cien "
Else
expresion = expresion + "ciento "
End If
Case “2”
expresion = expresion + "doscientos "
Case “3”
expresion = expresion + "trescientos "
Case “4”
expresion = expresion + "cuatrocientos "
Case “5”
expresion = expresion + "quinientos "
Case “6”
expresion = expresion + "seiscientos "
Case “7”
expresion = expresion + "setecientos "
Case “8”
expresion = expresion + "ochocientos "
Case “9”
expresion = expresion + "novecientos "
End Select
Case 2, 5, 8
Select Case Mid(entero, b, 1)
Case "1"
If Mid(entero, b + 1, 1) = "0" Then
flag = "S"
expresion = expresion + "diez "
End If
If Mid(entero, b + 1, 1) = "1" Then
flag = "S"
expresion = expresion + "once "
End If
If Mid(entero, b + 1, 1) = "2" Then
flag = "S"
expresion = expresion + "doce "
End If
If Mid(entero, b + 1, 1) = "3" Then
flag = "S"
expresion = expresion + "trece "
End If
If Mid(entero, b + 1, 1) = "4" Then
flag = "S"
expresion = expresion + "catorce "
End If
If Mid(entero, b + 1, 1) = "5" Then
flag = "S"
expresion = expresion + "quince "
End If
If Mid(entero, b + 1, 1) > "5" Then
flag = "N"
expresion = expresion + "dieci"
End If
Case "2"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "veinte "
flag = "S"
Else
expresion = expresion + "veinti"
flag = "N"
End If
Case "3"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "treinta "
flag = "S"
Else
expresion = expresion + "treinta y "
flag = "N"
End If
Case "4"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "cuarenta "
flag = "S"
Else
expresion = expresion + "cuarenta y "
flag = "N"
End If
Case "5"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "cincuenta "
flag = "S"
Else
expresion = expresion + "cincuenta y "
flag = "N"
End If
Case "6"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "sesenta "
flag = "S"
Else
expresion = expresion + "sesenta y "
flag = "N"
End If
Case "7"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "setenta "
flag = "S"
Else
expresion = expresion + "setenta y "
flag = "N"
End If
Case "8"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "ochenta "
flag = "S"
Else
expresion = expresion + "ochenta y "
flag = "N"
End If
Case "9"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "noventa "
flag = "S"
Else
expresion = expresion + "noventa y "
flag = "N"
End If
End Select
Case 1, 4, 7
Select Case Mid(entero, b, 1)
Case "1"
If flag = "N" Then
If paso = 1 Then
expresion = expresion + "uno "
Else
expresion = expresion + "un "
End If
End If
Case "2"
If flag = "N" Then
expresion = expresion + "dos "
End If
Case "3"
If flag = "N" Then
expresion = expresion + "tres "
End If
Case "4"
If flag = "N" Then
expresion = expresion + "cuatro "
End If
Case "5"
If flag = "N" Then
expresion = expresion + "cinco "
End If
Case "6"
If flag = "N" Then
expresion = expresion + "seis "
End If
Case "7"
If flag = "N" Then
expresion = expresion + "siete "
End If
Case "8"
If flag = "N" Then
expresion = expresion + "ocho "
End If
Case "9"
If flag = "N" Then
expresion = expresion + "nueve "
End If
End Select
End Select
If paso = 4 Then
If Mid(entero, 6, 1) <> "0" Or Mid(entero, 5, 1) <> "0" Or Mid(entero, 4, 1) <> "0" Or _
(Mid(entero, 6, 1) = "0" And Mid(entero, 5, 1) = "0" And Mid(entero, 4, 1) = "0" And _
Len(entero) <= 6) Then
expresion = expresion + "mil "
End If
End If
If paso = 7 Then
If Len(entero) = 7 And Mid(entero, 1, 1) = "1" Then
expresion = expresion + "milln "
Else
expresion = expresion + "millones "
End If
End If
Next paso
If deci <> "" Then
If Mid(entero, 1, 1) = "-" Then 'si el numero es negativo
EnLetras = "Menos " + uppercase(mid(expresion,1,1))+mid(expresion,2) + "con " + deci + "/100 centavos"
Else
EnLetras = uppercase(mid(expresion,1,1))+mid(expresion,2) + "con " + deci + "/100 centavos"
End If
Else
If Mid(entero, 1, 1) = "-" Then 'si el numero es negativo
EnLetras = "Menos " + uppercase(mid(expresion,1,1))+mid(expresion,2)
Else
EnLetras = uppercase(mid(expresion,1,1))+mid(expresion,2)
End If
End If
Else 'si el numero a convertir esta fuera del rango superior e inferior
EnLetras = “”
End If
return enletras
[quote=196322:@javier ledantes]Comparto codigo, es una funcion
Anduvo de lujo, suerte
func numeroaletra(n as string) as string
Dim b, paso As Integer
Dim expresion, entero, deci, flag As String
dim enletras as string
flag = “N”
For paso = 1 To Len(numero)
If Mid(numero, paso, 1) = “.” Then
flag = “S”
Else
If flag = “N” Then
entero = entero + Mid(numero, paso, 1) 'Extae la parte entera del numero
Else
deci = deci + Mid(numero, paso, 1) 'Extrae la parte decimal del numero
End If
End If
Next paso
If Len(deci) = 1 Then
deci = deci + “0”
End If
flag = “N”
If Val(numero) >= -999999999 And Val(numero) <= 999999999 Then 'si el numero esta dentro de 0 a 999.999.999
For paso = Len(entero) To 1 Step -1
b = Len(entero) - (paso - 1)
Select Case paso
Case 3, 6, 9
Select Case Mid(entero, b, 1)
Case “1”
If Mid(entero, b + 1, 1) = “0” And Mid(entero, b + 2, 1) = “0” Then
expresion = expresion + "cien "
Else
expresion = expresion + "ciento "
End If
Case “2”
expresion = expresion + "doscientos "
Case “3”
expresion = expresion + "trescientos "
Case “4”
expresion = expresion + "cuatrocientos "
Case “5”
expresion = expresion + "quinientos "
Case “6”
expresion = expresion + "seiscientos "
Case “7”
expresion = expresion + "setecientos "
Case “8”
expresion = expresion + "ochocientos "
Case “9”
expresion = expresion + "novecientos "
End Select
Case 2, 5, 8
Select Case Mid(entero, b, 1)
Case "1"
If Mid(entero, b + 1, 1) = "0" Then
flag = "S"
expresion = expresion + "diez "
End If
If Mid(entero, b + 1, 1) = "1" Then
flag = "S"
expresion = expresion + "once "
End If
If Mid(entero, b + 1, 1) = "2" Then
flag = "S"
expresion = expresion + "doce "
End If
If Mid(entero, b + 1, 1) = "3" Then
flag = "S"
expresion = expresion + "trece "
End If
If Mid(entero, b + 1, 1) = "4" Then
flag = "S"
expresion = expresion + "catorce "
End If
If Mid(entero, b + 1, 1) = "5" Then
flag = "S"
expresion = expresion + "quince "
End If
If Mid(entero, b + 1, 1) > "5" Then
flag = "N"
expresion = expresion + "dieci"
End If
Case "2"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "veinte "
flag = "S"
Else
expresion = expresion + "veinti"
flag = "N"
End If
Case "3"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "treinta "
flag = "S"
Else
expresion = expresion + "treinta y "
flag = "N"
End If
Case "4"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "cuarenta "
flag = "S"
Else
expresion = expresion + "cuarenta y "
flag = "N"
End If
Case "5"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "cincuenta "
flag = "S"
Else
expresion = expresion + "cincuenta y "
flag = "N"
End If
Case "6"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "sesenta "
flag = "S"
Else
expresion = expresion + "sesenta y "
flag = "N"
End If
Case "7"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "setenta "
flag = "S"
Else
expresion = expresion + "setenta y "
flag = "N"
End If
Case "8"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "ochenta "
flag = "S"
Else
expresion = expresion + "ochenta y "
flag = "N"
End If
Case "9"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "noventa "
flag = "S"
Else
expresion = expresion + "noventa y "
flag = "N"
End If
End Select
Case 1, 4, 7
Select Case Mid(entero, b, 1)
Case "1"
If flag = "N" Then
If paso = 1 Then
expresion = expresion + "uno "
Else
expresion = expresion + "un "
End If
End If
Case "2"
If flag = "N" Then
expresion = expresion + "dos "
End If
Case "3"
If flag = "N" Then
expresion = expresion + "tres "
End If
Case "4"
If flag = "N" Then
expresion = expresion + "cuatro "
End If
Case "5"
If flag = "N" Then
expresion = expresion + "cinco "
End If
Case "6"
If flag = "N" Then
expresion = expresion + "seis "
End If
Case "7"
If flag = "N" Then
expresion = expresion + "siete "
End If
Case "8"
If flag = "N" Then
expresion = expresion + "ocho "
End If
Case "9"
If flag = "N" Then
expresion = expresion + "nueve "
End If
End Select
End Select
If paso = 4 Then
If Mid(entero, 6, 1) <> "0" Or Mid(entero, 5, 1) <> "0" Or Mid(entero, 4, 1) <> "0" Or _
(Mid(entero, 6, 1) = "0" And Mid(entero, 5, 1) = "0" And Mid(entero, 4, 1) = "0" And _
Len(entero) <= 6) Then
expresion = expresion + "mil "
End If
End If
If paso = 7 Then
If Len(entero) = 7 And Mid(entero, 1, 1) = "1" Then
expresion = expresion + "millón "
Else
expresion = expresion + "millones "
End If
End If
Next paso
If deci <> "" Then
If Mid(entero, 1, 1) = "-" Then 'si el numero es negativo
EnLetras = "Menos " + uppercase(mid(expresion,1,1))+mid(expresion,2) + "con " + deci + "/100 centavos"
Else
EnLetras = uppercase(mid(expresion,1,1))+mid(expresion,2) + "con " + deci + "/100 centavos"
End If
Else
If Mid(entero, 1, 1) = "-" Then 'si el numero es negativo
EnLetras = "Menos " + uppercase(mid(expresion,1,1))+mid(expresion,2)
Else
EnLetras = uppercase(mid(expresion,1,1))+mid(expresion,2)
End If
End If
Else 'si el numero a convertir esta fuera del rango superior e inferior
EnLetras = “”
End If
return enletras[/quote]
Oye Amigo, perdon la Ignorancia, y como sacas la salida?
es decir se usa así no: numerosaletras(“numero”) y luego?
jejejeje, me paso, obvio es as, ejemplo
txtejemplo.text = numerosaletras(“500”)
te devolver “QUinientos” en el textbox
Gracias
Estaria bueno tener un repositorio exclusivo de funciones, procedimientos y trucos para xojo, individual al foro, es una buena idea, me sumaria con entusiasmo, y de paso hariamos mas inclusivo al lenguaje
You should look at nthfield to simplify your method. For example
[code]Dim numbers As String = “one two three four five six seven eight nine”
Dim result As String
result = nthfield(numbers, " ", 5)[/code]
Sorry about the English
Try this:
[code]Function NumberToWords(number As Int64) As String
If number = 0 Then Return “Zero”
If number < 0 Then Return "Minus " + NumberToWords(Abs(number))
Dim words As String
If (number \ 1000000000) > 0 Then
words = words + NumberToWords(number/ 1000000000) + " Billion "
number = number Mod 1000000000
End
If (number \ 1000000) > 0 Then
words = words + NumberToWords(number/ 1000000) + " Million "
number = number Mod 1000000
End
If (number \ 1000) > 0 Then
words = words + NumberToWords(number/ 1000) + " Thousand "
number = number Mod 1000
End
If (number \ 100) > 0 Then
words = words + NumberToWords(number/ 100) + " Hundred "
number = number Mod 100
End
If number > 0 Then
Dim aUnits() As String= Array(“Zero”, “One”, “Two”, “Three”, “Four”, “Five”, “Six”, “Seven”, “Eight”, “Nine”, “Ten”, _
“Eleven”, “Twelve”, “Thirteen”, “Fourteen”, “Fifteen”, “Sixteen”, “Seventeen”, “Eighteen”, “Nineteen”)
Dim aTens() As String= Array(“Zero”, “Ten”, “Twenty”, “Thirty”, “Forty”, “Fifty”, “Sixty”, “Seventy”, _
“Eighty”, “Ninety”)
If words <> "" Then words= words+ "and "
If number < 20 Then
words = words+ aUnits(number)
Else
words = words + aTens(number/ 10)
If (number Mod 10) > 0 Then words = words+ "-" + aUnits(number Mod 10)
End
End
Return words.Trim
End Function
[/code]
Muchas Gracias Simon, Voy a transformarlo al espaol y probando.
Hola Javier y Simon he estado traduciendo el cdigo de Simon, porque me parece mas basto, ya que puede analizar miles millones y billones.
Pero faltaba por analizar los cien miles.
Ahora ya analiza los cien miles, pero no analiza cuando son los cien miles mas extra.
Ejemplo:
100,000 = CIEN MIL
110,000 = DICE “DIEZ MIL” cuando debera decir CIENTO DIEZ MIL.
Este es el cdigo:
If number = 0 Then Return “CERO”
If number < 0 Then Return "MENOS " + NumerosALetras(Abs(number))
Dim words As String
Dim aMiles() As String= Array(“CERO”, “”, “DOS”, “TRES”, “CUATRO”, “CINCO”, “SEIS”, “SIETE”,_
“OCHO”, “NUEVE”, “DIEZ”, “ONCE”, “DOCE”, “TRECE”, “CATORCE”, “QUNICE”, “DIECISEIS”, “DIECISIETE”, “DIECIOCHO”, “DIECINUEVE”, “VEINTE”,_
“VEINTIUN”, “VEINTIDOS”, “VEINTITRES”, “VEINTICUATRO”, “VEINTICINCO”, “VEINTISEIS”,“VEINTISIETE”, “VEINTIOCHO”, “VEINTINUEVE”, “TRENTA”,_
“TREINTA Y UN”,“TREINTA Y DOS”, “TREINTA Y TRES”,“TREINTA Y CUATRO”, “TREINTA Y CINCO”,“TREINTA Y SEIS”,“TREINTA Y SIETE”, “TREINTA Y OCHO”,_
“TREINTA Y NUEVE”, “CUARENTA”, “CUARENTA Y UN”, “CUARENTA Y DOS”, “CUARENTA Y TRES”,“CUARENTA Y CUATRO”, “CUARENTA Y CINCO”,_
“CUARENTA Y SEIS”, “CUARENTA Y SIETE”, “CUARENTA Y OCHO”, “CUARENTA Y NUEVE”, “CINCUENTA”, “CINCUENTA Y UN”,“CUARENTA Y DOS”,_
“CINCUENTA Y TRES”, “CINCUENTA Y CUATRO”,“CINCUENTA Y CINCO”, “CINCUENTA Y SEIS”, “CINCUENTA Y SIETE”, “CINCUENTA Y OCHO”,_
“CUARENTA Y NUEVE”, “SESENTA”, “SESENTA Y UN”, “SESENTA Y DOS”, “SESENTA Y TRES”,“SESENTA Y CUATRO”, “SESENTA Y CINCO”,_
“SESENTA Y SEIS”, “SESENTA Y SIETE”, “SESENTA Y OCHO”,“SESENTA Y NUEVE”,“SETENTA”,“SETENTA Y UN”, “SETENTA Y DOS”, “SETENTA Y TRES”,_
“SETENTA Y CUATRO”, “SETENTA Y CINCO”, “SETENTA Y SEIS”,“SETENTA Y SIETE”, “SETENTA Y OCHO”, “SETENTA Y NUEVE”, “OCHENTA”,_
“OCHENTA Y UN”, “OCHENTA Y DOS”, “OCHENTA Y TRES”, “OCHENTA Y CUATRO”,“OCHENTA Y CINCO”, “OCHENTA Y SEIS”, “OCHENTA Y SIETE”,_
“OCHENTA Y OCHO”, “OCHENTA Y NUEVE”, “NOVENTA”, “NOVENTA Y UN”, “NOVENTA Y DOS”,“NOVENTA Y TRES”, “NOEVNTA Y CUATRO”,_
“NOVENTA Y CINCO”, “NOVENTA Y SEIS”, “NOVENTA Y SIETE”, “NOVENTA Y OCHO”, “NOVENTA Y NUEVE”)
Dim aCienMiles() As String= Array(“CERO”, “CIEN”, “DOSCIENTOS”, “TRESCIENTOS”, “CUATROCIENTOS”, “QUINIENTOS”, “SEISCIENTOS”, “SETECIENTOS”,_
“OCHOCIENTOS”, “NOVECIENTOS”)
Dim aMilllonesYmas() As String= Array(“CERO”, “UN”, “DOS”, “TRES”, “CUATRO”, “CINCO”, “SEIS”, “SIETE”,_
“OCHO”, “NUEVE”)
If (number \ 1000000000) > 0 Then
words = words + NumerosALetras(number/ 1000000000) + " BILLN "
number = number Mod 1000000000
End
If (number \ 1000000) > 0 Then
words = aMilllonesYmas(number/ 1000000) +" MILLN "
number = number Mod 1000000
End
If (number \ 100000) > 0 Then
words = aCienMiles(number/ 100000) +" MIL "
number = number Mod 100000
End
If (number \ 1000) > 0 Then
words = aMiles(number/ 1000) +" MIL "
number = number Mod 1000
End
Select case number
case 100
words = words + " CIEN PESOS"
number = number Mod 100
case 200
words = words + " DOSCIENTOS PESOS"
number = number Mod 100
case 300
words = words + " TRESCIENTOS PESOS"
number = number Mod 100
case 400
words = words + " CUATROCIENTOS PESOS"
number = number Mod 100
case 500
words = words + " QUINIENTOS PESOS"
number = number Mod 100
case 600
words = words + " SEISCIENTOS PESOS"
number = number Mod 100
case 700
words = words + " SETECIENTOS PESOS"
number = number Mod 100
case 800
words = words + " OCHOCIENTOS PESOS"
number = number Mod 100
case 900
words = words + " NOVECIENTOS PESOS"
number = number Mod 100
End Select
Dim aCienes() As String= Array(“CERO”, "CIENTO ", "DOSCIENTOS ", "TRESCIENTOS ", "CUATROCIENTOS ", "QUINIENTOS ", "SEISCIENTOS ",_
"SETECIENTOS ", "OCHOCIENTOS ", "NOVECIENTOS ")
Select case number
Case Is > 100
words = words + aCienes(number/ 100)
number = number Mod 100
End Select
If number > 0 Then
Dim aUnits() As String= Array(“CERO”, “UN”, “DOS”, “TRES”, “CUATRO”, “CINCO”, “SEIS”, “SIETE”, “OCHO”, “NUEVE”, “DIEZ”, _
“ONCE”, “DOCE”, “TRECE”, “CATORCE”, “QUINCE”, “DIECISEIS”, “DIECISIETE”, “DIECIOCHO”, “DIECINUEVE”,“VEINTE”,_
“VEINTIUN”, “VEINTIDOS”, “VEINTITRES”, “VEINTICUATRO”, “VEINTICINCO”, “VEINTISEIS”, “VEINTISIETE”, “VEINTIOCHO”, “VEINTINUEVE”)
Dim aTens() As String= Array(“CERO”, “DIEZ”, “VEINTE”, “TREINTA”, “CUARENTA”, “CINCUENTA”, “SESENTA”, “SETENTA”, _
“OCHENTA”, “NOVENTA”)
Select case number
Case Is < 30
words = words+ aUnits(number) + " PESOS"
Case Else
words = words + aTens(number/ 10)
If (number Mod 10) > 0 Then words = words+ " Y " + aUnits(number Mod 10) + " PESOS"
End select
End
Return words.Trim
Espero me puedan ayudar a saber que estoy haciendo mal.
Tambin tuve que hacer unas adecuaciones al cdigo debido a la naturaleza del idioma: Ingles / Espaol
Ya que por ejemplo no decimos: DOS CIEN o TRES CIEN. como en Ingls TWO HUNDRED o THREE HUNDRED
Nosotros decimos: DOSCIENTOS o TRESCIENTOS
Saludos
[quote=196322:@javier ledantes]Comparto codigo, es una funcion
Anduvo de lujo, suerte
func numeroaletra(n as string) as string
Dim b, paso As Integer
Dim expresion, entero, deci, flag As String
dim enletras as string
flag = “N”
For paso = 1 To Len(numero)
If Mid(numero, paso, 1) = “.” Then
flag = “S”
Else
If flag = “N” Then
entero = entero + Mid(numero, paso, 1) 'Extae la parte entera del numero
Else
deci = deci + Mid(numero, paso, 1) 'Extrae la parte decimal del numero
End If
End If
Next paso
If Len(deci) = 1 Then
deci = deci + “0”
End If
flag = “N”
If Val(numero) >= -999999999 And Val(numero) <= 999999999 Then 'si el numero esta dentro de 0 a 999.999.999
For paso = Len(entero) To 1 Step -1
b = Len(entero) - (paso - 1)
Select Case paso
Case 3, 6, 9
Select Case Mid(entero, b, 1)
Case “1”
If Mid(entero, b + 1, 1) = “0” And Mid(entero, b + 2, 1) = “0” Then
expresion = expresion + "cien "
Else
expresion = expresion + "ciento "
End If
Case “2”
expresion = expresion + "doscientos "
Case “3”
expresion = expresion + "trescientos "
Case “4”
expresion = expresion + "cuatrocientos "
Case “5”
expresion = expresion + "quinientos "
Case “6”
expresion = expresion + "seiscientos "
Case “7”
expresion = expresion + "setecientos "
Case “8”
expresion = expresion + "ochocientos "
Case “9”
expresion = expresion + "novecientos "
End Select
Case 2, 5, 8
Select Case Mid(entero, b, 1)
Case "1"
If Mid(entero, b + 1, 1) = "0" Then
flag = "S"
expresion = expresion + "diez "
End If
If Mid(entero, b + 1, 1) = "1" Then
flag = "S"
expresion = expresion + "once "
End If
If Mid(entero, b + 1, 1) = "2" Then
flag = "S"
expresion = expresion + "doce "
End If
If Mid(entero, b + 1, 1) = "3" Then
flag = "S"
expresion = expresion + "trece "
End If
If Mid(entero, b + 1, 1) = "4" Then
flag = "S"
expresion = expresion + "catorce "
End If
If Mid(entero, b + 1, 1) = "5" Then
flag = "S"
expresion = expresion + "quince "
End If
If Mid(entero, b + 1, 1) > "5" Then
flag = "N"
expresion = expresion + "dieci"
End If
Case "2"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "veinte "
flag = "S"
Else
expresion = expresion + "veinti"
flag = "N"
End If
Case "3"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "treinta "
flag = "S"
Else
expresion = expresion + "treinta y "
flag = "N"
End If
Case "4"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "cuarenta "
flag = "S"
Else
expresion = expresion + "cuarenta y "
flag = "N"
End If
Case "5"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "cincuenta "
flag = "S"
Else
expresion = expresion + "cincuenta y "
flag = "N"
End If
Case "6"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "sesenta "
flag = "S"
Else
expresion = expresion + "sesenta y "
flag = "N"
End If
Case "7"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "setenta "
flag = "S"
Else
expresion = expresion + "setenta y "
flag = "N"
End If
Case "8"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "ochenta "
flag = "S"
Else
expresion = expresion + "ochenta y "
flag = "N"
End If
Case "9"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "noventa "
flag = "S"
Else
expresion = expresion + "noventa y "
flag = "N"
End If
End Select
Case 1, 4, 7
Select Case Mid(entero, b, 1)
Case "1"
If flag = "N" Then
If paso = 1 Then
expresion = expresion + "uno "
Else
expresion = expresion + "un "
End If
End If
Case "2"
If flag = "N" Then
expresion = expresion + "dos "
End If
Case "3"
If flag = "N" Then
expresion = expresion + "tres "
End If
Case "4"
If flag = "N" Then
expresion = expresion + "cuatro "
End If
Case "5"
If flag = "N" Then
expresion = expresion + "cinco "
End If
Case "6"
If flag = "N" Then
expresion = expresion + "seis "
End If
Case "7"
If flag = "N" Then
expresion = expresion + "siete "
End If
Case "8"
If flag = "N" Then
expresion = expresion + "ocho "
End If
Case "9"
If flag = "N" Then
expresion = expresion + "nueve "
End If
End Select
End Select
If paso = 4 Then
If Mid(entero, 6, 1) <> "0" Or Mid(entero, 5, 1) <> "0" Or Mid(entero, 4, 1) <> "0" Or _
(Mid(entero, 6, 1) = "0" And Mid(entero, 5, 1) = "0" And Mid(entero, 4, 1) = "0" And _
Len(entero) <= 6) Then
expresion = expresion + "mil "
End If
End If
If paso = 7 Then
If Len(entero) = 7 And Mid(entero, 1, 1) = "1" Then
expresion = expresion + "millón "
Else
expresion = expresion + "millones "
End If
End If
Next paso
If deci <> "" Then
If Mid(entero, 1, 1) = "-" Then 'si el numero es negativo
EnLetras = "Menos " + uppercase(mid(expresion,1,1))+mid(expresion,2) + "con " + deci + "/100 centavos"
Else
EnLetras = uppercase(mid(expresion,1,1))+mid(expresion,2) + "con " + deci + "/100 centavos"
End If
Else
If Mid(entero, 1, 1) = "-" Then 'si el numero es negativo
EnLetras = "Menos " + uppercase(mid(expresion,1,1))+mid(expresion,2)
Else
EnLetras = uppercase(mid(expresion,1,1))+mid(expresion,2)
End If
End If
Else 'si el numero a convertir esta fuera del rango superior e inferior
EnLetras = “”
End If
return enletras[/quote]
Javier, que tal.
Una pregunta y en tu código como evaluar billones?
Saludos
OK lo tengo, as es como procesas los billones:
Dim b, paso As Integer
Dim expresion, entero, deci, flag As String
dim enletras as string
flag = “N”
For paso = 1 To Len(numero)
If Mid(numero, paso, 1) = “.” Then
flag = “S”
Else
If flag = “N” Then
entero = entero + Mid(numero, paso, 1) 'Extae la parte entera del numero
Else
deci = deci + Mid(numero, paso, 1) 'Extrae la parte decimal del numero
End If
End If
Next paso
If Len(deci) = 1 Then
deci = deci + “0”
End If
flag = “N”
'If Val(numero) >= -999999999 And Val(numero) <= 999999999 Then 'si el numero esta dentro de 0 a 999,999.999
If Val(numero) >= -999999999999 And Val(numero) <= 999999999999 Then 'si el numero esta dentro de 0 a 999,999.999
For paso = Len(entero) To 1 Step -1
b = Len(entero) - (paso - 1)
Select Case paso
Case 3, 6, 9, 12
Select Case Mid(entero, b, 1)
Case “1”
If Mid(entero, b + 1, 1) = “0” And Mid(entero, b + 2, 1) = “0” Then
expresion = expresion + "CIEN "
Else
expresion = expresion + "CIENTO "
End If
Case “2”
expresion = expresion + "DOSCIENTOS "
Case “3”
expresion = expresion + "TRESCIENTOS "
Case “4”
expresion = expresion + "CUATROCIENTOS "
Case “5”
expresion = expresion + "QUINIENTOS "
Case “6”
expresion = expresion + "SEISCIENTOS "
Case “7”
expresion = expresion + "SETECIENTOS "
Case “8”
expresion = expresion + "OCHOCIENTOS "
Case “9”
expresion = expresion + "NOVECIENTOS "
End Select
Case 2, 5, 8, 11
Select Case Mid(entero, b, 1)
Case "1"
If Mid(entero, b + 1, 1) = "0" Then
flag = "S"
expresion = expresion + "DIEZ "
End If
If Mid(entero, b + 1, 1) = "1" Then
flag = "S"
expresion = expresion + "ONCE "
End If
If Mid(entero, b + 1, 1) = "2" Then
flag = "S"
expresion = expresion + "DOCE "
End If
If Mid(entero, b + 1, 1) = "3" Then
flag = "S"
expresion = expresion + "TRECE "
End If
If Mid(entero, b + 1, 1) = "4" Then
flag = "S"
expresion = expresion + "CATORCE "
End If
If Mid(entero, b + 1, 1) = "5" Then
flag = "S"
expresion = expresion + "QUINCE "
End If
If Mid(entero, b + 1, 1) > "5" Then
flag = "N"
expresion = expresion + "DIECI "
End If
Case "2"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "VEINTE "
flag = "S"
Else
expresion = expresion + "VEINTI "
flag = "N"
End If
Case "3"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "TREINTA "
flag = "S"
Else
expresion = expresion + "TREINTA Y "
flag = "N"
End If
Case "4"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "CUARENTA "
flag = "S"
Else
expresion = expresion + "CUARENTA Y "
flag = "N"
End If
Case "5"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "CINCUENTA "
flag = "S"
Else
expresion = expresion + "CINCUENTA Y "
flag = "N"
End If
Case "6"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "SESENTA "
flag = "S"
Else
expresion = expresion + "SESENTA Y "
flag = "N"
End If
Case "7"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "SETENTA "
flag = "S"
Else
expresion = expresion + "SETENTA Y "
flag = "N"
End If
Case "8"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "OCHENTA "
flag = "S"
Else
expresion = expresion + "OCHENTA Y "
flag = "N"
End If
Case "9"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "NOVENTA "
flag = "S"
Else
expresion = expresion + "NOVENTA Y "
flag = "N"
End If
End Select
Case 1, 4, 7, 10
Select Case Mid(entero, b, 1)
Case "1"
If flag = "N" Then
If paso = 1 Then
expresion = expresion + "UNO "
Else
expresion = expresion + "UN "
End If
End If
Case "2"
If flag = "N" Then
expresion = expresion + "DOS "
End If
Case "3"
If flag = "N" Then
expresion = expresion + "TRES "
End If
Case "4"
If flag = "N" Then
expresion = expresion + "CUATRO "
End If
Case "5"
If flag = "N" Then
expresion = expresion + "CINCO "
End If
Case "6"
If flag = "N" Then
expresion = expresion + "SEIS "
End If
Case "7"
If flag = "N" Then
expresion = expresion + "SIETE "
End If
Case "8"
If flag = "N" Then
expresion = expresion + "OCHO "
End If
Case "9"
If flag = "N" Then
expresion = expresion + "NUEVE "
End If
End Select
End Select
If paso = 4 Then
If Mid(entero, 6, 1) <> "0" Or Mid(entero, 5, 1) <> "0" Or Mid(entero, 4, 1) <> "0" Or _
(Mid(entero, 6, 1) = "0" And Mid(entero, 5, 1) = "0" And Mid(entero, 4, 1) = "0" And _
Len(entero) <= 6) Then
expresion = expresion + "MIL "
End If
End If
If paso = 7 Then
If Len(entero) = 7 And Mid(entero, 1, 1) = "1" Then
expresion = expresion + "MILLN "
Else
expresion = expresion + "MILLONES "
End If
End If
//-------------------------
///------BILLONES------------------------
If paso = 10 Then
If Len(entero) = 10 And Mid(entero, 1, 1) = "1" Then
expresion = expresion + "BILLN "
Else
expresion = expresion + "BILLONES "
End If
End If
Next paso
If deci <> "" Then
If Mid(entero, 1, 1) = "-" Then 'si el numero es negativo
EnLetras = "MENOS " + uppercase(mid(expresion,1,1))+mid(expresion,2) + "PESOS " + LEFT(deci,2) + "/100 M. N."
Else
EnLetras = uppercase(mid(expresion,1,1))+mid(expresion,2) + "PESOS " + LEFT(deci,2) + "/100 M. N."
End If
Elseif deci = "" Then
If Mid(entero, 1, 1) = "-" Then 'si el numero es negativo
EnLetras = "MENOS " + uppercase(mid(expresion,1,1))+mid(expresion,2) + "PESOS 00/100 M. N."
Else
EnLetras = uppercase(mid(expresion,1,1))+mid(expresion,2) + "PESOS 00/100 M. N."
End If
Else
If Mid(entero, 1, 1) = "-" Then 'si el numero es negativo
EnLetras = "MENOS " + uppercase(mid(expresion,1,1))+mid(expresion,2)
Else
EnLetras = uppercase(mid(expresion,1,1))+mid(expresion,2)
End If
End If
Else 'si el numero a convertir esta fuera del rango superior e inferior
EnLetras = “”
End If
return enletras
la funcion en espaol no funciona del todo bien. habria que mejorarla. vere si puedo hacerlo
Google Translate:
Recuerdo que tena que hacer este ejercicio con mi Apple II en 1985 … (?) con BASIC AppleSoft.
Hay dos dificultades: la gramtica y la programacin!
en 2004 hice una funcion en visual fox pro solo por diversion… hoy quiero hacer una en xojo
y si. es cierto… la funcion número a letras presenta un desafio gramatical y de programacion… pero es una herramienta muy interesante para tener ya que en el entorno empresarial se usa
codigo en php --> https://github.com/AxiaCore/numero-a-letras/blob/master/php/NumberToLetterConverter.class.php
codigo en c# --> https://codepad.co/snippet/5252e6
codigo en python --> https://github.com/Axiacore/numero-a-letras/blob/master/python/number_to_letter.py
aqui esta el codigo previamente publicado … pero con algunas mejoras y/o emprolijamientos y/o personalizaciones que le hice para mi propio uso
[code]Public Function NumeroALetras(numero as string) as string
'eliminar el signo negativo para facilitar la creacion gramatical
'pero luego agregarlo a la expresion final
dim es_negativo as boolean
if mid(numero, 1, 1) = “-” then
numero = replaceall(numero, “-”, “”)
es_negativo = true
else
es_negativo = false
end if
'eliminar todos los espacios en blanco
numero = replaceall(numero, " ", “”)
'evaluar si lo ingresado es o no una expresion numerica
if isnumeric(numero) = false then
return “ERROR: expresion no numerica”
exit function
end if
Dim b, paso As Integer
Dim expresion, entero, deci, flag As String
dim enletras as string
flag = “N”
For paso = 1 To Len(numero)
If Mid(numero, paso, 1) = "." Then
flag = "S"
Else
If flag = "N" Then
entero = entero + Mid(numero, paso, 1) 'Extrae la parte entera del numero
Else
deci = deci + Mid(numero, paso, 1) 'Extrae la parte decimal del numero
End If
End If
Next paso
If Len(deci) = 1 Then
deci = deci + “0”
End If
flag = “N”
'cancelar si el numero a convertir esta fuera del rango superior e inferior (de 0 a 999,999.999)
If Val(replace(numero, “-”, “”)) > 999999999999 Then
return “ERROR: fuera de rango”
exit function
End If
For paso = Len(entero) To 1 Step -1
b = Len(entero) - (paso - 1)
Select Case paso
Case 3, 6, 9, 12
Select Case Mid(entero, b, 1)
Case "1"
If Mid(entero, b + 1, 1) = "0" And Mid(entero, b + 2, 1) = "0" Then
expresion = expresion + "CIEN "
Else
expresion = expresion + "CIENTO "
End If
Case "2"
expresion = expresion + "DOSCIENTOS "
Case "3"
expresion = expresion + "TRESCIENTOS "
Case "4"
expresion = expresion + "CUATROCIENTOS "
Case "5"
expresion = expresion + "QUINIENTOS "
Case "6"
expresion = expresion + "SEISCIENTOS "
Case "7"
expresion = expresion + "SETECIENTOS "
Case "8"
expresion = expresion + "OCHOCIENTOS "
Case "9"
expresion = expresion + "NOVECIENTOS "
End Select
Case 2, 5, 8, 11
Select Case Mid(entero, b, 1)
Case "1"
If Mid(entero, b + 1, 1) = "0" Then
flag = "S"
expresion = expresion + "DIEZ "
End If
If Mid(entero, b + 1, 1) = "1" Then
flag = "S"
expresion = expresion + "ONCE "
End If
If Mid(entero, b + 1, 1) = "2" Then
flag = "S"
expresion = expresion + "DOCE "
End If
If Mid(entero, b + 1, 1) = "3" Then
flag = "S"
expresion = expresion + "TRECE "
End If
If Mid(entero, b + 1, 1) = "4" Then
flag = "S"
expresion = expresion + "CATORCE "
End If
If Mid(entero, b + 1, 1) = "5" Then
flag = "S"
expresion = expresion + "QUINCE "
End If
If Mid(entero, b + 1, 1) > "5" Then
flag = "N"
expresion = expresion + "DIECI"
End If
Case "2"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "VEINTE "
flag = "S"
Else
expresion = expresion + "VEINTI"
flag = "N"
End If
Case "3"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "TREINTA "
flag = "S"
Else
expresion = expresion + "TREINTA Y "
flag = "N"
End If
Case "4"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "CUARENTA "
flag = "S"
Else
expresion = expresion + "CUARENTA Y "
flag = "N"
End If
Case "5"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "CINCUENTA "
flag = "S"
Else
expresion = expresion + "CINCUENTA Y "
flag = "N"
End If
Case "6"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "SESENTA "
flag = "S"
Else
expresion = expresion + "SESENTA Y "
flag = "N"
End If
Case "7"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "SETENTA "
flag = "S"
Else
expresion = expresion + "SETENTA Y "
flag = "N"
End If
Case "8"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "OCHENTA "
flag = "S"
Else
expresion = expresion + "OCHENTA Y "
flag = "N"
End If
Case "9"
If Mid(entero, b + 1, 1) = "0" Then
expresion = expresion + "NOVENTA "
flag = "S"
Else
expresion = expresion + "NOVENTA Y "
flag = "N"
End If
End Select
Case 1, 4, 7, 10
Select Case Mid(entero, b, 1)
Case "1"
If flag = "N" Then
If paso = 1 Then
expresion = expresion + "UNO "
Else
expresion = expresion + "UN "
End If
End If
Case "2"
If flag = "N" Then
expresion = expresion + "DOS "
End If
Case "3"
If flag = "N" Then
expresion = expresion + "TRES "
End If
Case "4"
If flag = "N" Then
expresion = expresion + "CUATRO "
End If
Case "5"
If flag = "N" Then
expresion = expresion + "CINCO "
End If
Case "6"
If flag = "N" Then
expresion = expresion + "SEIS "
End If
Case "7"
If flag = "N" Then
expresion = expresion + "SIETE "
End If
Case "8"
If flag = "N" Then
expresion = expresion + "OCHO "
End If
Case "9"
If flag = "N" Then
expresion = expresion + "NUEVE "
End If
End Select
End Select
If paso = 4 Then
If Mid(entero, 6, 1) <> "0" Or Mid(entero, 5, 1) <> "0" Or Mid(entero, 4, 1) <> "0" Or _
(Mid(entero, 6, 1) = "0" And Mid(entero, 5, 1) = "0" And Mid(entero, 4, 1) = "0" And _
Len(entero) <= 6) Then
expresion = expresion + "MIL "
End If
End If
If paso = 7 Then
msgbox(entero)
If Len(entero) = 7 And Mid(entero, 1, 1) = "1" then 'OR Len(entero) = 7 And Mid(numero, 1, 2) = "-1" Then
expresion = expresion + "MILLN "
Else
expresion = expresion + "MILLONES "
End If
End If
'billones
If paso = 10 Then
If Len(entero) = 10 And Mid(entero, 1, 1) = "1" Then
expresion = expresion + "BILLN "
Else
expresion = expresion + "BILLONES "
End If
End If
Next paso
'si el numero tiene parte decimal
If deci <> “” Then
expresion = expresion + "CON " + left(deci,2) + “/100”
end if
'si la parte decimal en numeros es cero cero
if deci = “” then
expresion = expresion + “CON 00/100”
end if
'si el nro es negativo
if es_negativo = true then
expresion = "MENOS " + expresion
end if
return expresion
End Function
[/code]
el anterior codigo funciona bien, pero tiene algunos errores gramaticales… incluso despues de haber corregido algunas pequeas cosas. hice mi propia funcion desde cero, y creo que genera muy bien la descripcion en letras de cualquier numero hasta el 999999999 con dos decimales
click aqui para ver el codigo en codepad.co