Numeros a letras..

1,072 views
Skip to first unread message

Cristian Torres

unread,
Apr 9, 2013, 3:24:59 PM4/9/13
to publice...@googlegroups.com

Hola..!! saludos a todos.. alguien me podria ayudar cen este programa..??

..---Programa que lee como entrada un número entre 0 y 999, y devuelve como salida el número escrito en letras.

Luis Maria Guayan

unread,
Apr 9, 2013, 3:22:46 PM4/9/13
to publice...@googlegroups.com
Aquí tienes una de las tantas que hay en PortalFox

:: Pasar un importe de numero a letras ::

http://www.portalfox.com/article.php?sid=24


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 09/04/2013 16:24, Cristian Torres escribió:

Jorge Montúfar

unread,
Apr 9, 2013, 3:29:18 PM4/9/13
to publicesvfoxpro
de repente te sirve este

PARAM cant
CLEA

STORE '' TO letras
STORE "UNO         DOS         TRES        CUATRO      CINCO       SEIS        SIETE       OCHO        NUEVE       DIEZ        ONCE        DOCE        TRECE       CATORCE     " TO parte1
STORE "UN          DOS         TRES        CUATRO      CINCO       SEIS        SIETE       OCHO        NUEVE       DIEZ        ONCE        DOCE        TRECE       CATORCE     " TO parte3
STORE "QUINCE      DIECISEIS   DIECISIETE  DIECIOCHO   DIECINUEVE  VEINTE      VEINTIUNO   VEINTIDOS   VEINTITRES  VEINTICUATROVEINTICINCO VEINTISEIS  VEINTISIETE VEINTIOCHO  VEINTINUEVE " TO numeros
STORE "DIEZ      VEINTE    TREINTA   CUARENTA  CINCUENTA SESENTA   SETENTA   OCHENTA   NOVENTA  " TO decimos
STORE "QUINCE      DIECISEIS   DIECISIETE  DIECIOCHO   DIECINUEVE  VEINTE      VEINTIUN    VEINTIDOS   VEINTITRES  VEINTICUATROVEINTICINCO VEINTISEIS  VEINTISIETE VEINTIOCHO  VEINTINUEVE " TO parte2
STORE "CIENTO        DOSCIENTOS    TRESCIENTOS   CUATROCIENTOS QUINIENTOS    SEISCIENTOS   SETECIENTOS   OCHOCIENTOS   NOVECIENTOS   " TO cientos
STORE VAL(SUBSTR(STR(cant,12,2),1,1)) TO ye
STORE VAL(SUBS(STR(cant,12,2),2,2)) TO ya
STORE VAL(SUBS(STR(cant,12,2),3,1)) TO yi
STORE VAL(SUBS(STR(cant,12,2),2,1)) TO yo
IF ye#0
IF ye=1 .AND. ya=0
STORE "CIEN"+letras TO letras
ELSE
STORE SUBS(cientos,(ye-1)*14+1,14)+letras TO letras
ENDIF
ENDIF
STORE RTRIM(letras)+" " TO letras
DO CASE
CASE ya=1
STORE letras+'UN ' TO letras
CASE ya<30 .AND. ya>0
IF ya<15
STORE letras+SUBS(parte1,(ya-1)*12+1,12) TO letras
ELSE
STORE letras+SUBS(parte2,(ya-1)*12+1-168,12) TO letras
ENDIF
CASE ya>29 .AND. yi=0
STORE letras+SUBS(decimos,(yo-1)*10+1,10) TO letras
CASE ya>29 .AND. yi#0
STORE letras+SUBS(decimos,(yo-1)*10+1,10) TO letras
STORE RTRIM(letras) TO letras
STORE letras+' Y ' TO letras
STORE letras+SUBS(parte3,(yi-1)*12+1,12) TO letras
ENDCASE
STORE RTRIM(letras)+" " TO letras
IF VAL(SUBS(STR(cant,12,2),1,3))=1
STORE letras+"MILLON " TO letras
ENDIF
IF VAL(SUBS(STR(cant,12,2),1,3)) > 1
STORE letras+"MILLONES " TO letras
ENDIF
*store val(subs(str(cant,9,2),1,1)) to a
*store val(subs(str(cant,9,2),2,2)) to b
*store val(subs(str(cant,9,2),3,1)) to c
*store val(subs(str(cant,9,2),2,1)) to d

STORE VAL(SUBS(STR(cant,12,2),4,1)) TO A
STORE VAL(SUBS(STR(cant,12,2),5,2)) TO B
STORE VAL(SUBS(STR(cant,12,2),6,1)) TO C
STORE VAL(SUBS(STR(cant,12,2),5,1)) TO D
IF A#0
IF A=1 .AND. B=0
STORE letras+"CIEN " TO letras
ELSE
STORE letras+SUBS(cientos,(A-1)*14+1,14) TO letras
ENDIF
ENDIF
STORE RTRIM(letras)+" " TO letras
DO CASE
CASE B=1
STORE letras+'UN ' TO letras
CASE B<30 .AND. B>0
IF B<15
STORE letras+SUBS(parte1,(B-1)*12+1,12) TO letras
ELSE
STORE letras+SUBS(parte2,(B-1)*12+1-168,12) TO letras
ENDIF
CASE B>29 .AND. C=0
STORE letras+SUBS(decimos,(D-1)*10+1,10) TO letras
CASE B>29 .AND. C#0
STORE letras+SUBS(decimos,(D-1)*10+1,10) TO letras
STORE RTRIM(letras) TO letras
STORE letras+' Y ' TO letras
STORE letras+SUBS(parte3,(C-1)*12+1,12) TO letras
ENDCASE
STORE RTRIM(letras)+" " TO letras
IF A+B+C > 0
STORE letras+'MIL ' TO letras
STORE RTRIM(letras)+" " TO letras
ENDIF
STORE RTRIM(letras)+" " TO letras
*   store val(subs(str(cant,9,2),4,1)) to a
*   store val(subs(str(cant,9,2),5,2)) to b
*   store val(subs(str(cant,9,2),6,1)) to c
*   store val(subs(str(cant,9,2),5,1)) to d
STORE VAL(SUBS(STR(cant,12,2),7,1)) TO A
STORE VAL(SUBS(STR(cant,12,2),8,2)) TO B
STORE VAL(SUBS(STR(cant,12,2),9,1)) TO C
STORE VAL(SUBS(STR(cant,12,2),8,1)) TO D
IF A#0
IF A=1 .AND. B=0
STORE letras+"CIEN " TO letras
ELSE
STORE letras+SUBS(cientos,(A-1)*14+1,14) TO letras
ENDIF
ENDIF
STORE RTRIM(letras)+" " TO letras
DO CASE
CASE B<30 .AND. B>0
IF B<15
STORE letras+SUBS(parte1,(B-1)*12+1,12) TO letras
ELSE
STORE letras+SUBS(numeros,(B-1)*12+1-168,12) TO letras
ENDIF
CASE B>29 .AND. C=0
STORE letras+SUBS(decimos,(D-1)*10+1,10) TO letras
CASE B>29 .AND. C#0
STORE letras+SUBS(decimos,(D-1)*10+1,10) TO letras
STORE RTRIM(letras) TO letras
STORE letras+' Y ' TO letras
STORE letras+SUBS(parte1,(C-1)*12+1,12) TO letras
ENDCASE
STORE RTRIM(letras)+" " TO letras
STORE letras+'QUETZALES CON '+SUBS(STR(cant,12,2),11,2)+'/100' TO letras
STORE LTRIM(RTRIM(letras)) TO letras

*@ 16, 05 SAY LETRAS
RETURN
*: EOF: LETRAS.PRG

Ariel D'Alfeo

unread,
Apr 9, 2013, 3:31:02 PM4/9/13
to publice...@googlegroups.com
hace un tiempo buscaba lo mismo y esta rutina la encontre en ww.PORTALFOX.com  ... creo.. pero funciona toma como parametro el numero total


Function Convierte_numeros_a_letras(Total)

  Dimension aUnidades(9), aDecenas(14), aCentenas(10)
  aUnidades(1) = 'UN'
  aUnidades(2) = 'DOS'
  aUnidades(3) = 'TRES'
  aUnidades(4) = 'CUATRO'
  aUnidades(5) = 'CINCO'
  aUnidades(6) = 'SEIS'
  aUnidades(7) = 'SIETE'
  aUnidades(8) = 'OCHO'
  aUnidades(9) = 'NUEVE'
  aDecenas(1) = 'DIEZ'
  aDecenas(2) = 'ONCE'
  aDecenas(3) = 'DOCE'
  aDecenas(4) = 'TRECE'
  aDecenas(5) = 'CATORCE'
  aDecenas(6) = 'QUINCE'
  aDecenas(7) = 'VEINTE'
  aDecenas(8) = 'TREINTA'
  aDecenas(9) = 'CUARENTA'
  aDecenas(10) = 'CINCUENTA'
  aDecenas(11) = 'SESENTA'
  aDecenas(12) = 'SETENTA'
  aDecenas(13) = 'OCHENTA'
  aDecenas(14) = 'NOVENTA'
  aCentenas(1) = 'CIEN'
  aCentenas(2) = 'DOSCIENTOS'
  aCentenas(3) = 'TRESCIENTOS'
  aCentenas(4) = 'CUATROCIENTOS'
  aCentenas(5) = 'QUINIENTOS'
  aCentenas(6) = 'SEISCIENTOS'
  aCentenas(7) = 'SETECIENTOS'
  aCentenas(8) = 'OCHOCIENTOS'
  aCentenas(9) = 'NOVECIENTOS'

  vTotal = str(int(Total), 12)

  Do case
    Case empty(val(vTotal))
      Texto = 'CERO PESOS'

    Case val(vTotal) = 1
      Texto = 'UN PESO'

    Otherwise
      tCientos     = obt_cant(substr(vTotal,10,3))
      tMiles       = obt_cant(substr(vTotal,7,3))
      tMillones    = obt_cant(substr(vTotal,4,3))
      tMilMillones = obt_cant(substr(vTotal,1,3))

      tCientos = tCientos
      tMiles = iif(empty(tMiles), '', ;
               iif(tMiles='UN', '', tMiles + ' ') + 'MIL ')
      tMillones = iif(empty(tMillones), '', ;
               tMillones + ' MILLON' + iif(tMillones='UN', ' ', 'ES ') +;
               iif(empty(tMiles + tCientos), 'DE', ''))
      tMilMillones = iif(empty(tMilMillones), '', ;
               iif(tMilMillones='UN', '', tMilMillones + ' ') + 'MIL ' +;
               iif(empty(tMillones), 'MILLONES ', ' ') +;
               iif(empty(tMillones + tMiles + tCientos), 'DE', ''))

      Texto = strtran(tMilMillones + tMillones + tMiles + tCientos, '  ', ' ') + ' PESOS'
  Endcase
 
Return Texto + iif(!empty(Total), ' CON ' + ;
   strtran(transform(int((total - int(total)) * ;
   100), '**'), '*', '0') + '/100 M.N.', '')

Function obt_cant(valor)
  Public Unidades, Decenas, Centenas

  If empty(val(valor))
    Return ''
  Endif

  Store '' to tUnidades, tDecenas, tCentenas
  Unidades = int(val(substr(valor,3,1)))        &&          123
  Decenas  = int(val(substr(valor,2,1)))        && vTotal = 999
  Centenas = int(val(substr(valor,1,1)))        &&          ^^^
  valor = int(val(valor))

  tUnidades = iif(!empty(unidades), aUnidades(Unidades), '')

  If !empty(decenas)
    If decenas = 1
      tDecenas = iif(val(right(str(valor,3),2)) >= 10 and ;
      val(right(str(valor,3),2)) <= 15, aDecenas(val(right(str(valor,3),2)) - 9), 'DIECI' + tUnidades)
      tUnidades = ''
    Else
      tDecenas = aDecenas(Decenas + 5)
        If !Empty(Unidades)
            If Decenas = 2
            tDecenas = Left(tDecenas, Len(tDecenas) - 1) + 'I'
            Else
            tDecenas = Left(tDecenas, Len(tDecenas)) + ' Y '
            Endif
        Endif

    Endif
endif
  If !empty(centenas)
    tCentenas = aCentenas(centenas)
    If valor > 100
      If centenas = 1
        tCentenas = tCentenas + 'TO '
      Else
        tCentenas = tCentenas + ' '
      Endif
    Endif
  Endif
 
Return tCentenas + tDecenas + tUnidades

***************************************************************************

-- 
Ariel D'Alfeo
Córdoba, Argentina

El 09/04/2013 16:24, Cristian Torres escribió:

Cristian Torres

unread,
Apr 9, 2013, 4:02:19 PM4/9/13
to publice...@googlegroups.com
Gracias a todos por sus suguerencias solo que lo que en relidad busco no es un programa de una base de datos sino un programa sencillo que introdusca un numero y de como salida su nombre en letras..
 

Luis Maria Guayan

unread,
Apr 9, 2013, 4:08:37 PM4/9/13
to publice...@googlegroups.com
Preguntas en un Foro de Visual FoxPro y te brindaron funciones y programas de Visual FoxPro ¿Que es lo que esperabas?

Capaz que este enlace te ayude
http://numeros-a-letras.todala.info

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 09/04/2013 17:02, Cristian Torres escribió:

Cristian Torres

unread,
Apr 9, 2013, 4:19:14 PM4/9/13
to publice...@googlegroups.com
Disculpa si la pregunta te incomdo pero si no te gustan mis preguntas ignoralas.. o sea si no me vas a ayudar no me molestes ok..!!
 

Luis Maria Guayan

unread,
Apr 9, 2013, 4:23:47 PM4/9/13
to publice...@googlegroups.com
Cristian ¿que te pasa? ¿Un día malo en la escuela?

Te ayudé con dos soluciones y enlaces:


:: Pasar un importe de numero a letras ::
http://www.portalfox.com/article.php?sid=24

:: Numeros a letras ::
http://numeros-a-letras.todala.info

¿O también deseas que te hagamos la tarea completa?


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 09/04/2013 17:19, Cristian Torres escribió:

Analyzer

unread,
Apr 9, 2013, 4:34:59 PM4/9/13
to Comunidad de Visual Foxpro en Español
Cristian Torres,

Voy a aclararte algo para que no termines molesto.

Tu dices que quieres algo que no lleva bases de datos.

Los codigos que te enviaron por ahi no llevan bases de datos.

Y hacen lo que tu solicitas.

Este foro es un foro de expertos en VFP donde por lo general se ofrecen soluciones a quienes tienen un problema durante el desarrollo de un sistema en producción.

De hecho, la persona a quien acabas de pedir que no te moleste, es un gran experto de VFP y alguien que me ayudado mucho a aprender.

No te molestes amigo, si hay algo que no comprendas del código, mejor pregunta y con gusto se te responde.

Veo que tu correo dice que estás estudiando para Técnico en Sistemas.

Lo que digo, es para tu propio bien.. No te molestes.

Saludos!


Saludos!

Miguel Canchas

unread,
Apr 9, 2013, 4:38:53 PM4/9/13
to publice...@googlegroups.com

Que la pasa a este gasnapiro….

 

MK

Mauricio Gonzalez

unread,
Apr 9, 2013, 4:40:36 PM4/9/13
to publice...@googlegroups.com
Tienes razon Cristian, pero te pregunto? Buscabas ayuda o quieres que se te haga la tarea escolar?
Tienes razon, las preguntas tontas se ignoran...............

Saul Piña Hernandez

unread,
Apr 9, 2013, 6:22:57 PM4/9/13
to publice...@googlegroups.com
Cristian, y tu nieve de que la quieres?

Jorge Montúfar

unread,
Apr 9, 2013, 6:35:09 PM4/9/13
to publicesvfoxpro
Primero deberias de analizar el codigo que se te envio porque segun lo que pediste eso entendimos o para la proxima mejor decinos cual es tu tarea y asi te ayudamos con todo gusto, pero te comento Luis y los otros son grandes conocedores de VFP y muchos de ellos me han ayudado mucho.

Nene tranquilo aqui todos necesitamos de todos.

Saludos Cordiales

Rafael Morales

unread,
Apr 9, 2013, 6:36:47 PM4/9/13
to publice...@googlegroups.com
Cristian Torres, no quisiera estar en tus zapatos. Insultaste a la persona equivocada. Mejor cayate y analizá bien la ayuda que te brindaron porque es excelente. Saludos.


El 9 de abril de 2013 19:22, Saul Piña Hernandez <vfxpro...@gmail.com> escribió:
Cristian, y tu nieve de que la quieres?



--
Rafael Morales

Dante Bravo

unread,
Apr 9, 2013, 6:50:12 PM4/9/13
to publice...@googlegroups.com, crt...@gmail.com
Cristian, alguna vez escuchaste "lugar equivocado en la hora equivocada" ? Bueno, eso te paso
Seria bueno que le pidas disculpas a Luis Maria, no porque sea unos de los gurues de VFP, sino porque es una buena persona y eso lo hace acreedor a dicha disculpa
Abrazos

zelimott

unread,
Apr 9, 2013, 7:19:40 PM4/9/13
to publice...@googlegroups.com
Llevo en esta profesión más de 30 años.
Me permito, humildemente, una sugerencia:
No lo dudes, para ser un buen programador es totalmente recomendable estudiar y desarrollar los casos que te propongan tus maestros.
Hoy en día toda las soluciones comunes se encuentra en internet (san google).
Esto lleva a un camino muy tentador que consiste en no tener que pensar porque todo está a mano, o dicho de otra manera, que otros piense por uno.
Esta facilidad genera una incómoda dependencia y te va a perjudicar apenas enfrentes los desafíos del mercado.
Slds.

FidelJ

unread,
Apr 10, 2013, 11:28:32 AM4/10/13
to publice...@googlegroups.com
Agrego otra versión más de números a letras. En este caso basada en Alines() y GetWordNum()

* ----------------------------------------------------------
PROCEDURE EnLetras(xnNumero,xcSymbol,xnSymbol,xlOmitDecimal)
* ----------------------------------------------------------
* LPARAMETERS xnNumero,xcSymbol,xnSymbol,xlOmitDecimal
* xnNumero: Número que se convierte en expresión literal
* xcSymbol: Símbolo que termina la expresión - DEfault="*"
* xnSymbol: Repeticiones de xcSymbol
* xlOmitDecimal: Si se omite la parte decimal cuando no tiene decimales
* ----------------------------------------------------------------------
* Autor: Fidel Charny
* ----------------------------------------------------------------------
* Basada en Alines() y GetWordNum() » Visual Fox Pro 9
* ----------------------------------------------------------------------
IF VARTYPE(xcSymbol)#"C"
xcSymbol="*"
ENDIF
IF VARTYPE(xnSymbol)#"N"
xnSymbol=3
ENDIF
IF VARTYPE(xnNumero)#"N"
RETURN ""
ENDIF

LOCAL lcLetra,lcparte,lcEnletra,lcDecimal,CV1,CV10,i,;
lnDecimal,LnNumero,lcNumero,lcTerminador,;
lcUnidades,lcDecPar,lcDecenas,lcCentenas
store "" to LcEnLetras,CV1,CV10

lcTerminador=EVL(REPLICATE(xcSymbol,xnSymbol),"")

xnNumero=Abs(xnnumero)
IF xnNumero = 0 
STORE "0" TO CV1,CV10
STORE "CERO" TO LcEnLetras
RETURN LcEnLetras+IIF(xlOmitDecimal,""," CON "+CV10+CV1+"/100"+lcTerminador)
ENDIF

LOCAL ARRAY gasep(6,2)

gaSep[1,1]=1
gaSep[2,1]=2
gaSep[3,1]=3
gaSep[4,1]=4
gaSep[5,1]=5
gaSep[6,1]=6

gaSep[1,2]=[]
gaSep[2,2]=[MIL]
gaSep[3,2]=[MILLON]
gaSep[4,2]=[MIL]
gaSep[5,2]=[BILLON]
gaSep[6,2]=[MIL]


lcUnidades="UN,DOS,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE"
lcDecPar="ONCE,DOCE,TRECE,CATORCE,QUINCE,DIECISEIS,DIECISIETE,DIECIOCHO,DIECINUEVE"
lcDecenas="DIEZ,VEINTE,TREINTA,CUARENTA,CINCUENTA,SESENTA,SETENTA,OCHENTA,NOVENTA"
lcCentenas="CIENTO,DOSCIENTOS,TRESCIENTOS,CUATROCIENTOS,QUINIENTOS,";
+"SEISCIENTOS,SETECIENTOS,OCHOCIENTOS,NOVECIENTOS"

lnDecimal=0
lnEntero=INT(xnNumero)
lnDecimal=xnNumero - lnEntero
lcNumero=ALLTRIM(TRANSFORM(lnEntero,"999,999,999,999,999"))

CVO=INT((xnNumero-INT(xnNumero))*100+.009)
CVD=INT(CVO/10)
CVU=INT(CVO-CVD*10)
lcDecimal="CON "+LTRIM(STR(CVD))+LTRIM(STR(CVU))+"/100"
IF lnDecimal=0.and.xlOmitDecimal
lcDecimal=""
ENDIF

RELEASE gapartes
nlines=ALINES(gaLines,lcNumero,1,",")
LOCAL ARRAY gaPartes(nLInes,4)
STORE "" TO GaPartes
lnPas=nLines
FOR i=1 TO nlines
gaPartes[i,1]=galines[i]
gapartes[i,4]=lnPas
lnpas=lnpas-1
NEXT

FOR i=1 TO ALEN(gaPartes,1)
lcLetra=""
lcParte=gaPartes[i,1]
lnValor=VAL(lcparte)
lnLen=LEN(lcParte)
lSaltUni=.f.
DO case
CASE lnLen=3
* 1 Centena
IF LEFT(lcParte,1)#"0"
IF LEFT(lcParte,1)="1".AND.RIGHT(lcParte,2)="00"
lcLetra="CIEN"
ELSE
lcLetra=GETWORDNUM(LcCentenas,VAL(LEFT(lcParte,1)),",")+" "
ENDIF
ENDIF
* 2 Decenas y Unidades
lcSub=right(lcParte,2)
DO case
CASE LEFT(lcSub,1)="0"
CASE LEFT(lcSub,1)="1"
IF RIGHT(lcSub,1)="0"
LcLetra=lcLetra+GETWORDNUM(LcDecenas,VAL(LEFT(lcSub,1)),",")
ELSE
lcLetra=lcLetra+GETWORDNUM(lcDecPar,VAL(RIGHT(lcSub,1)),",")+" "
lSaltUni=.t.
ENDIF
CASE LEFT(lcSub,1)="2"
IF RIGHT(lcSub,1)="0"
lcLetra=lcLetra+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",")+" "
lSaltUni=.t.
ELSE
lcLetra=lcLetra+"VEINTI"
ENDIF
OTHERWISE
lSaltuni=IIF(RIGHT(lcSub,1)="0",.t.,.f.)
lcLetra=lcLetra+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",");
+IIF(RIGHT(lcSub,1)="0"," "," Y ")

ENDCASE
* Unidades
IF !lSaltUni.And.Right(lcParte,1)#"0"
IF i=nLines.and.Right(lcParte,1)="1"
lcLetra=lcLetra+"UNO"
ELSE
lcLetra=lcLetra+GETWORDNUM(lcUnidades,VAL(RIGHT(lcParte,1)),",")
ENDIF
ENDIF
CASE lnLen=2
* 2 Decenas y Unidades
lcSub=lcParte
DO case
CASE LEFT(lcSub,1)="0"
CASE LEFT(lcSub,1)="1"
IF RIGHT(lcSub,1)="0"
lcLetra=lcLetra+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",")+" "
ELSE
lcLetra=lcLetra+GETWORDNUM(lcDecPar,VAL(RIGHT(lcSub,1)),",")+" "
lSaltUni=.t.
ENDIF
CASE LEFT(lcSub,1)="2"
IF RIGHT(lcSub,1)="0"
lcLetra=lcLetra+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",")+" "
lSaltUni=.t.
ELSE
lcLetra=lcLetra+"VEINTI"
ENDIF
OTHERWISE
lSaltuni=IIF(RIGHT(lcSub,1)="0",.t.,.f.)
lcLetra=lcLetra+GETWORDNUM(lcDecenas,VAL(LEFT(lcSub,1)),",");
+IIF(RIGHT(lcSub,1)="0"," "," Y ")
ENDCASE
* Unidades
IF !lSaltUni.And.Right(lcParte,1)#"0"
IF i=nLines.and.Right(lcParte,1)="1"
lcLetra=lcLetra+"UNO"
ELSE
lcLetra=lcLetra+GETWORDNUM(lcUnidades,VAL(RIGHT(lcParte,1)),",")
ENDIF
ENDIF
CASE lnLen=1
IF lcParte#"0"
IF i=nLines.and.lcParte="1"
lcletra=lcLetra+"UNO"
ELSE
lcLetra=lcLetra+GETWORDNUM(lcUnidades,VAL(lcParte),",")
ENDIF
endif
ENDCASE
gaPartes[i,2]=ALLTRIM(lcLetra)
lcAdd=""
IF INLIST(GaPartes[i,4],3,5)
IF lnValor>1
lcAdd="ES"
ENDIF
ENDIF
gapartes[i,3]=gasep( ASCAN(gasep,gaPartes[i,4])+1 )+LcAdd
NEXT
lcLetras=""
FOR i=1 TO ALEN(gaPartes,1)
IF !EMPTY(gaPartes[i,2])
lcLetras=lcLetras+ALLTRIM(gaPartes[i,2])+" ";
+ALLTRIM(gaPartes[i,3])+" "
ENDIF
NEXT

lcEnLetras=STRTRAN(lcEnLetras,CHR(32)+CHR(32),CHR(32))
lcEnLetras=ALLTRIM(lcLetras)+IIF(EMPTY(lcDecimal),""," "+LcDecimal);
+lcTerminador

RETURN lcEnLetras

Jhonny Zambrana

unread,
Apr 10, 2013, 11:31:51 AM4/10/13
to publice...@googlegroups.com
Grande LuisMa, tu si que sabes bancarte, yo en tu lugar hubiera reaccionado mal, pero tu mi amigo eres todo un Ghandi.

Un abrazo y que tengas un lindo dia.

Cristian Torres

unread,
Apr 13, 2013, 11:54:22 PM4/13/13
to publice...@googlegroups.com
bueno disculpenme y les pido que me comprendan todos ya que soy novato en programar y bueno me uni a este grupo para aprender algo mas.. pero gracias por todas sus suguerencias..

Antonio.xt

unread,
Apr 15, 2013, 9:36:28 AM4/15/13
to publice...@googlegroups.com

Cristian, si eres novato en programar y si quieres aprender mas, entonces con mas razon deberias entrar con otra actitud a un grupo especializado en Visual FoxPro, donde hay desde principiantes como tu, intermedios, y hasta avanzados; y master, como el señor Luis Maria.

En este grupo encontraras ayuda e informacion muy util; eso si, las tareas no se te van a hacer.

Aun tengo una duda, el inicio del hilo escribiste lo siguiente:
- alguien me podria ayudar con este "PROGRAMA"?
Y luego especificas:
- "PROGRAMA" que lee como entrada un numero entre 0 y 999 y devuelve el numero escrito en letras.

Y te mendaron un monton de programas y funciones que realizan esa funcion, aun no se que es lo que esperabas. No esperabas un EXE, verdad?

Cristian Torres

unread,
Apr 15, 2013, 4:32:38 PM4/15/13
to publice...@googlegroups.com
no no esperaba un exe.. la verda ya tengo una idea acerca de este programa solo que no se como dividir el numero en unidades decenas y centenas..!! me podrías ayudar solo en eso por favor te lo voy a agradecer mucho..!!

Analyzer

unread,
Apr 15, 2013, 4:45:37 PM4/15/13
to Comunidad de Visual Foxpro en Español
Cristian, 
T
ienes algo de código ya elaborado? Podrías mostrarnos tu avance?..

O puedes explicar tu idea para ayudarte en base a tu idea?..

Solo quieres numeros del 0 al 999, verdad?..


Saludos!

Cristian Torres

unread,
Apr 15, 2013, 4:48:56 PM4/15/13
to publice...@googlegroups.com
Me imagino algo asi

 DO CASE
         CASE lnUnidades = 1
            lcCadena = IIF(lnTerna = 1 AND tnFlag = 0, 'UNO ', 'UN ')
         CASE lnUnidades = 2
            lcCadena = 'DOS '
         CASE lnUnidades = 3
            lcCadena = 'TRES '
         CASE lnUnidades = 4
            lcCadena = 'CUATRO '
         CASE lnUnidades = 5
            lcCadena = 'CINCO '
         CASE lnUnidades = 6
            lcCadena = 'SEIS '
         CASE lnUnidades = 7
            lcCadena = 'SIETE '
         CASE lnUnidades = 8
            lcCadena = 'OCHO '
         CASE lnUnidades = 9
            lcCadena = 'NUEVE '
      ENDCASE

      *--- Analizo las decenas
      DO CASE
         CASE lnDecenas = 1
            DO CASE
               CASE lnUnidades = 0
                  lcCadena = 'DIEZ '
               CASE lnUnidades = 1
                  lcCadena = 'ONCE '
               CASE lnUnidades = 2
                  lcCadena = 'DOCE '
               CASE lnUnidades = 3
                  lcCadena = 'TRECE '
               CASE lnUnidades = 4
                  lcCadena = 'CATORCE '
               CASE lnUnidades = 5
                  lcCadena = 'QUINCE '
               OTHER
                  lcCadena = 'DIECI' + lcCadena
            ENDCASE
         CASE lnDecenas = 2
            lcCadena = IIF(lnUnidades = 0, 'VEINTE ', 'VEINTI') + lcCadena
         CASE lnDecenas = 3
            lcCadena = 'TREINTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
         CASE lnDecenas = 4
            lcCadena = 'CUARENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
         CASE lnDecenas = 5
            lcCadena = 'CINCUENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
         CASE lnDecenas = 6
            lcCadena = 'SESENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
         CASE lnDecenas = 7
            lcCadena = 'SETENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
         CASE lnDecenas = 8
            lcCadena = 'OCHENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
         CASE lnDecenas = 9
            lcCadena = 'NOVENTA ' + IIF(lnUnidades = 0, '', 'Y ') + lcCadena
      ENDCASE

      *--- Analizo las centenas
      DO CASE
         CASE lnCentenas = 1
            lcCadena = IIF(lnUnidades = 0 AND lnDecenas = 0, ;
               'CIEN ', 'CIENTO ') + lcCadena
         CASE lnCentenas = 2
            lcCadena = 'DOSCIENTOS ' + lcCadena
         CASE lnCentenas = 3
            lcCadena = 'TRESCIENTOS ' + lcCadena
         CASE lnCentenas = 4
            lcCadena = 'CUATROCIENTOS ' + lcCadena
         CASE lnCentenas = 5
            lcCadena = 'QUINIENTOS ' + lcCadena
         CASE lnCentenas = 6
            lcCadena = 'SEISCIENTOS ' + lcCadena
         CASE lnCentenas = 7
            lcCadena = 'SETECIENTOS ' + lcCadena
         CASE lnCentenas = 8
            lcCadena = 'OCHOCIENTOS ' + lcCadena
         CASE lnCentenas = 9
            lcCadena = 'NOVECIENTOS ' + lcCadena
      ENDCASE

@4,2 say 'Respuesta' get lccadena pict "@!"
CLEAR gets 

Víctor Hugo Espínola Domínguez

unread,
Apr 15, 2013, 4:53:02 PM4/15/13
to publicesvfoxpro
Hola Cristian

Unidad   = MOD( Numero, 10 )

Decena  = INT( MOD( Numero, 100 ) / 10 )

Centena = INT( MOD( Numero, 1000 ) / 100 )

Millar     = INT( MOD( Numero, 10000 ) / 1000 )

DiezMil = INT( MOD( Numero, 100000 ) / 10000 )

Saludos,
Víctor.


Analyzer

unread,
Apr 15, 2013, 4:57:30 PM4/15/13
to Comunidad de Visual Foxpro en Español
Cristian,

Para el ingreso de los datos (si no te están pidiendo usar forms y eso para esta rutina) (recordar que Cristian está estudiando para Técnico en Sistemas..)

Puedes tomar esta pequeña rutina como "plantilla" para aceptar datos:

* Programa para detectar la ultima tecla presionada.
CLEAR
R="S"
DO WHILE R="S"

CLEAR
@ 5,35 SAY "PRESIONE UNA TECLA POR FAVOR"
INKEY(0)
@ 10,35 SAY "EL VALOR DE LA ULTIMA TECLA ES:"
@ 10,75 SAY STR(LASTKEY())

@ 15,40 SAY "REPETIR (S/N):" GET R PICT "@!" VALID R$"SN"
READ

ENDDO

CLEAR
RETURN
    
Es decir, podrías meter tu rutina dentro de un while y usar get y read para leer tus valores.

A partir de ahi, veo que ya lo vas implementando según la idea que tienes..

Saludos!

Cristian Torres

unread,
Apr 15, 2013, 5:05:43 PM4/15/13
to publice...@googlegroups.com

Muchas gracias Victor y Analyzer sus respuestas me ayudaron mucho..!!
 

Luis Maria Guayan

unread,
Apr 15, 2013, 5:11:44 PM4/15/13
to publice...@googlegroups.com
La primera función que te pasé realizaba esa tarea, si la hubieses probado en vez de tratarme mal, seguro que ganabas mucho tiempo. Te paso la tarea completa, solo ejecuta el siguiente código:

lc = inputbox("Ingrese un numero", "Pasar numero a letra")
messagebox(N2l(val(lc)),64,"Ud. ingreso el número")


*--------------------------------------------------------------------------
* FUNCTION N2L(tnNro, tnFlag)
*--------------------------------------------------------------------------
* Devuelve un número entero en letras
* Usada por Let2Num (deben estar ambas)
* USO: ? N2L(32) -> TREINTA Y DOS
* RETORNA: Caracter
* AUTOR: LMG
*--------------------------------------------------------------------------
FUNCTION N2L(tnNro, tnFlag)
   IF EMPTY(tnFlag)
      tnFlag = 0
   ENDIF
   LOCAL lnEntero, lcRetorno, lnTerna, lcMiles, ;
      lcCadena, lnUnidades, lnDecenas, lnCentenas
   lnEntero = INT(tnNro)
   lcRetorno = ''
   lnTerna = 1
   DO WHILE lnEntero > 0
      lcCadena = ''
      lnUnidades = MOD(lnEntero, 10)
      lnEntero = INT(lnEntero / 10)
      lnDecenas = MOD(lnEntero, 10)
      lnEntero = INT(lnEntero / 10)
      lnCentenas = MOD(lnEntero, 10)
      lnEntero = INT(lnEntero / 10)

      *--- Analizo la terna
      DO CASE
         CASE lnTerna = 1
            lcMiles = ''
         CASE lnTerna = 2 AND (lnUnidades + lnDecenas + lnCentenas # 0)
            lcMiles = 'MIL '
         CASE lnTerna = 3 AND (lnUnidades + lnDecenas + lnCentenas # 0)
            lcMiles = IIF(lnUnidades = 1 AND lnDecenas = 0 AND ;
               lnCentenas = 0, 'MILLON ', 'MILLONES ')
         CASE lnTerna = 4 AND (lnUnidades + lnDecenas + lnCentenas # 0)
            lcMiles = 'MIL MILLONES '
         CASE lnTerna = 5 AND (lnUnidades + lnDecenas + lnCentenas # 0)
            lcMiles = IIF(lnUnidades = 1 AND lnDecenas = 0 AND ;
               lnCentenas = 0, 'BILLON ', 'BILLONES ')
         CASE lnTerna > 5
            lcRetorno = ' ERROR: NUMERO DEMASIADO GRANDE '
            EXIT
      ENDCASE

      *--- Analizo las unidades
      *--- Armo el retorno terna a terna
      lcRetorno = lcCadena + lcMiles + lcRetorno
      lnTerna = lnTerna + 1
   ENDDO
   IF lnTerna = 1
      lcRetorno = 'CERO '
   ENDIF
   RETURN lcRetorno
ENDFUNC

*--------------------------------------------------------------------------


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Cristian Torres

unread,
Apr 15, 2013, 5:27:51 PM4/15/13
to publice...@googlegroups.com
Disculpame por mi actuacion anterior se que fue muy grosero.. pero gracias ya que devido a esa respuesta tuve la idea y puede terminar..!!

Eric Natareno Guerra

unread,
Apr 15, 2013, 6:29:24 PM4/15/13
to publice...@googlegroups.com

Minimo Cristian
Saludos Luis Maria te admiro

Analyzer

unread,
Apr 15, 2013, 11:45:33 PM4/15/13
to Comunidad de Visual Foxpro en Español
Cristian,

Es que quizás no te has dado cuenta que el jefe Luis María Guayán es una persona muy altruista con la comunidad VFP.

Tan altruista que tiene todo un sitio web con artículos hasta traducidos al Español a donde la mayoría de los profesionales de VFP acuden para documentarse, bajar rutinas, utilerías, etc.

El sitio es fácil de ubicar. Se llama Portalfox.


Talvez eso te ayude un poco a comprender la molestia de los compañeros..

Qué bien que ya hiciste funcionar el código.

Si no, pues ya te acaban de dar la rutina terminada.


Saludos!

Luigi Gamboa

unread,
Sep 27, 2014, 6:51:02 PM9/27/14
to publice...@googlegroups.com, thenewin...@gmail.com
Hoy tuve que revisar el tema y como no encontré algo sencillo, me animé a rehacer, ahí va mi aporte:

function numalet(n)
local q1,q2,q3,q4,q5,q6,lt,z,n,n1
q1="UN    DOS   TRES  CUATROCINCO SEIS  SIETE OCHO  NUEVE "
q2="DIEZ   ONCE   DOCE   TRECE  CATORCEQUINCE "
q3="VEINTI     TREINTA Y  CUARENTA Y CINCUENTA YSESENTA Y  SETENTA Y  OCHENTA Y  NOVENTA Y  "
q4="VEINTE   TREINTA  CUARENTA CINCUENTASESENTA  SETENTA  OCHENTA  NOVENTA  "
q5="C      DOC    TREC   CUATROCQUIN   SEISC  SETEC  OCHOC  NOVEC"
q6="MIL    BILLON MIL    MILLON MIL           "
lt=iif(n<0,"MENOS ","")
z="CON "+right(str(n,15,2),2)+"/100"
n=abs(int(n))
n1=right(space(18)+trim(str(n)),18)
if n=0
lt="CERO"+z
else
q=1
do while q<>7
sub3=substr(n1,q*3-2,3)
if sub3<>space(3)
if val(sub3)>199
lt=lt+trim(substr(q5,val(left(sub3,1))*7-6,7))+"IENTOS "
endif
if val(sub3)>=101 and val(sub3)<=199
lt=lt+"CIENTO "
endif
sub2=substr(sub3,2,2)
lt=lt+icase(sub3="100","CIEN ",sub3="000" or sub2="00","",;
val(sub2)<10,trim(substr(q1,val(sub2)*6-5,6))+" ",val(sub2)<16,;
trim(substr(q2,(val(substr(sub2,2,1))+1)*7-6,7))+" ",;
val(sub2)<20,"DIECI"+trim(substr(q1,val(substr(sub2,2,1))*6-5,6))+" ",;
substr(sub2,2,1)="0",trim(substr(q4,(val(sub2)/10-1)*9-8,9))+" ",;
trim(substr(q3,(val(substr(sub2,1,1))-1)*11-10,11))+iif(sub2<"30",""," ")+;
trim(substr(q1,val(substr(sub2,2,1))*6-5,6))+" ")
do case
case substr(sub3,2,1)<>"1" and substr(sub3,3,1)="1" and q=6
lt=trim(lt)+"O "
case (val(sub3)=0 and val(substr(n1,(q-1)*3-2,3))> 0 and q=int(q/2)*2 and q<6) or (val(sub3)>1 and q=int(q/2)*2 and q<6)
lt=lt+trim(substr(q6,q*7-6,7))+"ES "
case (val(sub3)>0 and q<>int(q/2)*2 and q<6) or (val(sub3)>0 and q=int(q/2)*2 and q<6)
lt=lt+trim(substr(q6,q*7-6,7))+" "
endcase
endif
q=q+1
enddo
lt=lt+z
endif
return lt

Luis Maria Guayan

unread,
Sep 27, 2014, 7:54:10 PM9/27/14
to publice...@googlegroups.com
Esta función es la que utilizo y me acompaña por mas de 20 años (Creo que la original la escribí en mi época de Clipper Summer 87) :-)

-- Pasar un importe de numero a letras --
http://comunidadvfp.blogspot.com/2014/09/pasar-un-importe-de-numero-letras.html

Luis María Guayán
Tucumán, Argentina

_____________________________
http://comunidadvfp.blogspot.com

Reply all
Reply to author
Forward
0 new messages