Convertir numeros a letras

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]

1 Like

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