Ayuda con esta funcion...

Ayuda con esta funcion...

Postby JoseGS » Thu Jan 14, 2010 1:41 pm

Hola amigos del foro

La funcion adjunta la utilizo para convertir los numeros a letras y la he empleado con exito desde clipper 5x pasando por FW23 pero ahora que trato de utilizarla en FWH al parecer no funciona debido a que no se pueden utilizar variables privadas ni publicas. Esta funcion es de vital importancia para mi ya que el sistema que estoy desarrollando debe imprimir cheques... he buscado en el foro una funcion equivalente y me he encontrado con una bastante larga. Me gustaria la ayuda de alguno de ustedes que me pueda decir como reutilizar este codigo en FWH. Esta funcion trabaja perfectamente en mis programas de FW23 agradezco mucho la ayuda que me puedan brindar.

CODIGO DE LA FUNCION: (Fue tomada de un libro que se llama Clipper Sumer 87 de EIDOS...)

(para tratar de resolver el caso he definido todas las locales y publicas como STATIC pero no ha funcionado...)

*--------------------------------------------------------------------------------------------------------------------------*
FUNC NUMLETRAS(NUM)
PRIV GRUPOS[5],ENLETRA,GRUPO,NUMSTR,UNIDAD,DECENA,CENTENA,;
UNI0,UNI1,UNI2,UNI3,UNI4,UNI5,UNI6,UNI7,UNI8,UNI9,DEC0,;
DEC1,DEC2,DEC3,DEC4,DEC5,DEC6,DEC7,DEC8,DEC9,CEN0,CEN1,;
CEN2,CEN3,CEN4,CEN5,CEN6,CEN7,CEN8,CEN9,DEC11,DEC12,DEC13,;
DEC14,DEC15,DEC16,DEC17,DEC18,DEC19,CONECT1,CONECT2,CONECT3,;
CONECT4,CONECT5,UNILET,DECLET,CENLET,CONECTOR,GRUPOST,GRUPOSTR
PUBLIC NUMERO:=NUM
UNI0="IIF(NUMERO=0 .AND. GRUPO=1,'cero','')"
UNI1="IIF(DECENA='1',DEC1&UNIDAD,IIF(GRUPOS[GRUPO]='001'.AND. (GRUPO=2 .OR. GRUPO=4),'',IIF(GRUPO>2,'un','una')))"
UNI2="IIF(DECENA='1',DEC1&UNIDAD,'dos')"
UNI3="IIF(DECENA='1',DEC1&UNIDAD,'tres')"
UNI4="IIF(DECENA='1',DEC1&UNIDAD,'cuatro')"
UNI5="IIF(DECENA='1',DEC1&UNIDAD,'cinco')"
UNI6="IIF(DECENA='1',DEC1&UNIDAD,'seis')"
UNI7="IIF(DECENA='1',DEC1&UNIDAD,'siete')"
UNI8="IIF(DECENA='1',DEC1&UNIDAD,'ocho')"
UNI9="IIF(DECENA='1',DEC1&UNIDAD,'nueve')"
DEC0="''"
DEC1="IIF(UNIDAD='0','diez','')"
DEC11="once"
DEC12="doce"
DEC13="trece"
DEC14="catorce"
DEC15="quince"
DEC16="dieciseis"
DEC17="diecisiete"
DEC18="dieciocho"
DEC19="diecinueve"
DEC2="IIF(UNIDAD='0','veinte','veinti')"
DEC3="'treinta'+IIF(UNIDAD<>'O',' y ','')"
DEC4="'cuarenta'+IIF(UNIDAD<>'O',' y ','')"
DEC5="'cincuenta'+IIF(UNIDAD<>'O',' y ','')"
DEC6="'sesenta'+IIF(UNIDAD<>'O',' y ','')"
DEC7="'setenta'+IIF(UNIDAD<>'O',' y ','')"
DEC8="'ochenta'+IIF(UNIDAD<>'O',' y ','')"
DEC9="'noventa'+IIF(UNIDAD<>'O',' y ','')"
CEN0="''"
CEN1="IIF(DECENA+UNIDAD='00','cien','ciento')"
CEN2="'doscient'+IIF(GRUPO<3,'os','os')"
CEN3="'trescient'+IIF(GRUPO<3,'os','os')"
CEN4="'cuatrocient'+IIF(GRUPO<3,'os','os')"
CEN5="'quinient'+IIF(GRUPO<3,'os','os')"
CEN6="'seiscient'+IIF(GRUPO<3,'os','os')"
CEN7="'setecient'+IIF(GRUPO<3,'os','os')"
CEN8="'ochocient'+IIF(GRUPO<3,'os','os')"
CEN9="'novecient'+IIF(GRUPO<3,'os','os')"
CONECT1="''"
CONECT2="IIF(GRUPOS[2]>'000',' mil','')"
CONECT3="IIF(GRUPOS[3]>'000' .OR. GRUPOS[4]>'000',IIF(GRUPOS[3]='001','mill¢n','millones'),'')"
CONECT4="IIF(GRUPOS[4]>'000',' mil','')"
CONECT5="IIF(GRUPOS[5]>'000',IIF(GRUPOS[5]='001','bill¢n','billones'),'')"
ENLETRA=''

NUMSTR=ALLTRIM(STR(NUMERO))
NUMSTR=REPLICATE('0',15-LEN(NUMSTR))+NUMSTR
FOR GRUPO=1 TO 5
GRUPOS[5-GRUPO+1]=SUBSTR(NUMSTR,(GRUPO-1)*3+1,3)
NEXT
FOR GRUPO=5 TO 1 STEP -1
UNIDAD=RIGHT(GRUPOS[GRUPO],1)
DECENA=SUBSTR(GRUPOS[GRUPO],2,1)
CENTENA=LEFT(GRUPOS[GRUPO],1)
UNILET=UNI&UNIDAD
DECLET=DEC&DECENA
CENLET=CEN&CENTENA
GRUPOSTR=STR(GRUPO,1)
CONECTOR=CONECT&GRUPOSTR
ENLETRA=ENLETRA+" "+&CENLET+" "+&DECLET+&UNILET+&CONECTOR
NEXT
RETU ENLETRA
JoseGS
 
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am

Re: Ayuda con esta funcion...

Postby Patricio Avalos Aguirre » Thu Jan 14, 2010 1:56 pm

Hola

he hecho un copy paste y funciona muy bien...

que error te da?

Code: Select all  Expand view
    alert( NUMLETRAS(100) )
    alert( NUMLETRAS(20000) )
    alert( NUMLETRAS(999966) )
 


Image
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
Patricio Avalos Aguirre
 
Posts: 1059
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Re: Ayuda con esta funcion...

Postby Hernan Diego Ceccarelli » Thu Jan 14, 2010 3:46 pm

Hola gente linda, como anda todo por aca !!! :D

Esta la hice yo, espero te satisfaga:
Code: Select all  Expand view


FUNCTION NumLetra( nImporte, nDec )

   local cTexto:= '' /// Equivale a '999999999999.99'
   local cPicture:=  Replicate('9',12)
   local lSonSoloCentavos:= .F., nCpn
   local cNumero,aU,aD,aV,aC,aE,aM
   local nImporteDec:= 0

   DEFAULT nDec:= 2

   if nImporte < 0
      cTexto:= 'Menos'
      nImporte *=-1   /// Lo paso a positivo
   endif

   if nDec == 0
      nImporte:= Int( nImporte )
   endif

   if nDec > 0
      cPicture+= '.' + Replicate('9', nDec)
   endif

   if nImporte < 1 .and. nImporte > 0  // Solo Decimales
      nImporteDec:= Val( SubStr( Transform( nImporte, "9.9999999999999999" ), 3, nDec ) )
      nImporte   := Val( AllTrim(Str(Int(nImporte))) + "." + AllTrim(Str(Int(nImporteDec))) )
   endif

   //// Evaluo la cadena numerica ,dividiendola en cuadro partes:
   //// 999 - 999 - 999 - 999 y los decimales correspondientes.

   cNumero := Transform( nImporte , cPicture )
   nImporte:= Val( cNumero )

   do case
      case nImporte  == 0 .and. nImporteDec == 0
         cTexto  := 'Cero'

      case nDec > 0 .and. nImporteDec > 0
         nImporte:= nImporteDec
         cNumero := Transform( nImporte , cPicture )
         lSonSoloCentavos:= .T.
   endcase


   aU:= {'Uno','Dos','Tres','Cuatro','Cinco','Seis','Siete','Ocho','Nueve'}
   aD:= {'Once','Doce','Trece','Catorce','Quince','Dieciseis','Diecisiete',;
         'Dieciocho','Diecinueve'}
   aV:= {'Diez','Veinte','Treinta','Cuarenta','Cincuenta','Sesenta','Setenta',;
         'Ochenta','Noventa'}
   aC:= {'Ciento','Doscientos','Trescientos','Cuatrocientos','Quinientos',;
         'Seiscientos','Setecientos','Ochocientos','Novecientos'}
   aE:= {'Veintiuno','Veintidos','Veintitres','Veinticuatro','Veinticinco',;
         'Veintiseis','Veintisiete','Veintiocho','Veintinueve'}
   aM:= {'Billones','Millones','Mil','/100'}


   for nCpn = 1 to 4  /// Los 4 '999'

      //// Analizo 1er. 9 ///
      if Val(SubStr(cNumero,1,1)) <> 0  // Si existe Centena !!!
         do case
            case SubStr(cNumero,1,3) == '100'
               cTexto:= AllTrim(cTexto) + Space(1) + SubStr(aC[1],1,4)
            otherwise
               cTexto:= AllTrim(cTexto) + Space(1) + aC[Val(SubStr(cNumero,1,1))]
         endcase
      endif

      //// Analizo 2do. 9 ///
      if Val(SubStr(cNumero,2,1)) <> 0  // Si existe Decena !!!
         do case
            case SubStr(cNumero,2,1) == '1' .and. SubStr(cNumero,3,1) <> '0'
               cTexto:= AllTrim(cTexto) + Space(1) + aD[ Val(SubStr(cNumero,3,1)) ]
            case SubStr(cNumero,2,1) == '2' .and. SubStr(cNumero,3,1) <> '0'
               cTexto:= AllTrim(cTexto) + Space(1) + aE[ Val(SubStr(cNumero,3,1)) ]
            otherwise
               cTexto:= AllTrim(cTexto) + Space(1) + aV[ Val(SubStr(cNumero,2,1)) ]
         endcase
      endif

      //// Analizo 3er. 9 ///
      if Val(SubStr(cNumero,3,1)) <> 0 // Si existe la Unidad !!!
         do case
            case SubStr(cNumero,2,1) == '1' .or. SubStr(cNumero,2,1) == '2'
            // Del 1 al 29 ya se habrian definido antes.-
            otherwise
               if Val(SubStr(cNumero,1,2)) <> 0 .and. Val(SubStr(cNumero,2,1)) <> 0
                  cTexto:= AllTrim(cTexto)+' y'
               endif
               cTexto:= AllTrim(cTexto) + Space(1) + aU[ Val(SubStr(cNumero,3,1)) ]
         endcase

         if nCpn <> 4 .and. SubStr(cNumero,3,1) == '1' .and. ;
            SubStr(cNumero,2,1) <> '1'

            cTexto:= SubStr( AllTrim(cTexto), 1, Len(AllTrim(cTexto))-1 )
            /// Sino quedaria Uno millon o Uno mil => Le saco el ultimo caracter.

         endif
      endif

      if nCpn < 4

          if ! Val(SubStr(cNumero,1,3)) == 0
             cTexto:= AllTrim(cTexto) + Space(1) + aM[nCpn]
          endif

          if (nCpn == 1 .or. nCpn == 2) .and. Val(SubStr(cNumero,1,3)) == 1  /// '  1'
             cTexto:= SubStr( AllTrim(cTexto) , 1, Len(AllTrim(cTexto))-4) + 'ón'
             /// Le saco el 'ones' y le pongo 'ón'
          endif

      endif

      cNumero:= SubStr( cNumero , 4 )

   next

   cNumero:= SubStr(cNumero,2,2)  /// Decimales del Nro.

   if Val(cNumero) <> 0  // Si tiene decimales
      cTexto:= AllTrim(cTexto)+' Con '+ cNumero +"/1"+Replicate("0",nDec)
   endif

   if lSonSoloCentavos

      cTexto:= StrTran(cTexto,'Uno','Un ')
      cTexto:= AllTrim(cTexto) + ' Centavo'
      if nImporte > 1
         cTexto+= 's'
      endif

      if nDec <> 2 // No le Cabe la palabra "centavo<s>" cuando nDec no es 2.
         cTexto:= "Cero Con " + AllTrim(Str(nImporteDec))+"/1"+Replicate("0",nDec)
      endif

   endif

RETURN( AllTrim( cTexto ) )
 
User avatar
Hernan Diego Ceccarelli
 
Posts: 84
Joined: Fri Oct 07, 2005 4:51 pm
Location: Rosario - Santa Fe - Argentina

Re: Ayuda con esta funcion...

Postby acuellar » Thu Jan 14, 2010 4:13 pm

Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1593
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Ayuda con esta funcion...

Postby JoseGS » Thu Jan 14, 2010 8:02 pm

Hola amigos

voy a probar las informaciones que me han suministrado... y les informo.

Otra pregunta
En FWH se pueden utilizar variables publicas y privadas ?. En mi caso no he podido... me envia un error
JoseGS
 
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am

Re: Ayuda con esta funcion...

Postby acuellar » Thu Jan 14, 2010 9:14 pm

Jose, claro que se pueden definir

Function tufuncion()
Local var1,var2
Public var3,var4
Private var5,var6
...

Return

Tendrías que mostrar el error, quizas sea ambiguas de advertencia por el nivel de advertencia en tu enlazador, en UEstudio viene por defecto 1 hay que ponerle 0

Saludos

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1593
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Ayuda con esta funcion...

Postby JoseGS » Sat Jan 16, 2010 2:57 am

Hola a todos:

Gracias Hernan, utilice la funcion suministrada y esta perfecta !!!

Caso cerrado !
JoseGS
 
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am

Re: Ayuda con esta funcion...

Postby JoseGS » Sun Jan 17, 2010 1:22 pm

Se me olvidava: Gracias Cuellar, tambien me funciono lo de las variables.
JoseGS
 
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 89 guests