FUNÇÃO: Valores extensos até quatrilhão(ESpanhol).

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

FUNÇÃO: Valores extensos até quatrilhão(ESpanhol).

Mensagem por rochinha »

Amiguinhos,

Depois de ver o problema no tópico Função Valores em Extenso em Inglês e buscar uma solução me veio a idéia de verificar minha função de extenso.

Após alguns testes verifiquei que ela precisava de mais uma manutenção para correção e adendos e o resultado final esta logo abaixo:

Código: Selecionar todos

* Arquivo...: EXTENSOES.PRG 
* Autor.....: Jose Carlos da Rocha
* 
* O codigo original reside como parte integrante do livro de Jose Ramalho
* 
* Proposito: Mostrar valores em extenso em ESpanhol

Function Main()

   ? "EXTENSOES( 275.49 )"          ,, EXTENSOES( 275.49 )
   ? "EXTENSOES( 100 )"             ,, EXTENSOES( 100 )
   ? "EXTENSOES( 999 )"             ,, EXTENSOES( 999 )
   ? "EXTENSOES( 1000 )"            ,, EXTENSOES( 1000 )
   ? "EXTENSOES( 1000000 )"         ,, EXTENSOES( 1000000 )
   ? "EXTENSOES( 1000000000 )"      ,, EXTENSOES( 1000000000 )
   ? "EXTENSOES( 1000000000000 )"   ,, EXTENSOES( 1000000000000 )
   ? "EXTENSOES( 1000000000000.52 )",, EXTENSOES( 1000000000000.52 )
   ? "EXTENSOES( 1000000000000000 )",, EXTENSOES( 1000000000000000 )
   ? "EXTENSOES( 3101256786765.45 )",, EXTENSOES( 3101256786765.45 )
   ? "EXTENSOES( 1000000.01 )"      ,, EXTENSOES( 1000000.01 )
   ? "EXTENSOES( 6000000000.01 )"   ,, EXTENSOES( 6000000000.01 )
   ? "EXTENSOES( 2000000000000.00 )",, EXTENSOES( 2000000000000.00 )
   ? "EXTENSOES( 2.00 )"            ,, EXTENSOES( 2.00 )
   ? "EXTENSOES( 1.99 )"            ,, EXTENSOES( 1.99 )
   ? "EXTENSOES( 0.23 )"            ,, EXTENSOES( 0.23 )
   ? "EXTENSOES( 0.47 )"            ,, EXTENSOES( 0.47 )
   ? "EXTENSOES( 7.52 )"            ,, EXTENSOES( 7.52 )
   
Return Nil

FUNCTION EXTENSOES( PVALOR )
   LOCAL TSTR   := STRZERO(ABS(PVALOR),21,2)
   LOCAL ACIFRA := {{'Cuatrillon' ,'Cuatrillones'},;
                    {'Trillon'    ,'Trillones'},;
                    {'Billon'     ,'Billones'},;
                    {'Millon'     ,'Millones'},;
                    {'Mil'        ,'Mil'},;
                    {'   '        ,'   '},;
                    {'Centavo'    ,'Centavos'}}
   LOCAL TX
   LOCAL TEXTENSO := ' '
   LOCAL TSUBS    := ' '
   LOCAL TCENTAVOS:= (PVALOR-int(PVALOR))*100 // VAL(SUBSTR(TSTR,17))
   IF (PVALOR>0)
      IF (TCENTAVOS>0) .or. ("." $ STR(PVALOR))
         IF (PVALOR<1)
            TEXTENSO:=EXTCEM(STRZERO(TCENTAVOS,3)) + ACIFRA[7][IIF(TCENTAVOS=1,1,2)]
         ELSE
            IF (TCENTAVOS>0)
               TEXTENSO:=" Peso" + iif(PVALOR>=2,"s","") + " con " + EXTCEM(STRZERO(TCENTAVOS,3)) + ACIFRA[7][IIF(TCENTAVOS=1,1,2)]
            ELSE
               TEXTENSO:=" Peso" + iif(PVALOR>=2,"s","") + " "
            ENDIF
         ENDIF
      ENDIF
      FOR TX := 6 TO 1 STEP -1
          IF (VAL(TSUBS:=SUBSTR(TSTR,(TX*3)-2,3))>0)
             TEXTENSO:=EXTCEM(TSUBS)+ACIFRA[TX][IIF(VAL(TSUBS)=1,1,2)]+' '+TEXTENSO
          ENDIF
      NEXT TX
   ENDIF
   if PVALOR > 1
      TEXTENSO:=strtran(TEXTENSO,"Uno","Un")
   endif
   if "." $ STR(PVALOR)
      if ("ILLON" $ upper(TEXTENSO))
         TEXTENSO:=strtran(TEXTENSO," Peso"," de Peso")
      endif 
   endif 
   RETURN(STRIPDOUBLE(TEXTENSO,' '))

FUNCTION EXTCEM(PCEM)
LOCAL AVAL := {VAL(SUBSTR(PCEM,1,1)),;
               VAL(SUBSTR(PCEM,2,1)),;
               VAL(SUBSTR(PCEM,3,1))}
LOCAL TTAM,TEXT := ''
LOCAL ACENT := { 'Ciento','Doscientos','Trescientos','Cuatrocientos','Quinientos','Seiscientos','Setecientos','Ochocientos','Novecientos'}
LOCAL AVINT := { 'Once','Doce','Trece','Catorce','Quince','Dieciseis','Diecisiete','Dieciocho','Diecinueve' }
LOCAL ADEZ  := { 'Diez','Veinte','Treinta','Cuarenta','Cincuenta','Sesenta','Setenta','Ochenta','Noventa' }
LOCAL AUNIT := { 'Uno','Dos','Tres','Cuatro','Cinco','Seis','Siete','Ocho','Nueve' }
IF (VAL(PCEM)>0)
   IF (VAL(PCEM)==100)
      TEXT := 'Cien '
   ELSE
      IF (AVAL[1]>0)
         TEXT := ACENT[AVAL[1]]+IIF((AVAL[2]+AVAL[3]>0),' y ',' ')
      ENDIF
      IF (AVAL[2]=1).AND.(AVAL[3]>0)
         TEXT := TEXT + ' '+AVINT[AVAL[3]]
      ELSE
         IF (AVAL[2]>0)
            TEXT := TEXT+' '+ADEZ[AVAL[2]]+IIF(AVAL[3]>0,' y ','')
         ENDIF
         TEXT := TEXT+IIF(AVAL[3]>0,' '+AUNIT[AVAL[3]],' ')
      ENDIF
   ENDIF
ENDIF
RETURN(TEXT := TEXT+' ')

FUNCTION STRIPDOUBLE(PSTRING,PCHAR)
WHILE (PCHAR+PCHAR$(PSTRING:=STRTRAN(PSTRING,PCHAR+PCHAR,PCHAR)))
ENDDO
RETURN(PSTRING)
PS: Fica a cargo dos nobres colegas produzir as versões em Húngaro, Alemão, Polonês, Árabe, Chiita, Aramáico, Egípsio, Tântrico e cabalês.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
joaoalpande
Usuário Nível 2
Usuário Nível 2
Mensagens: 93
Registrado em: 24 Fev 2005 09:04
Localização: CAMPO GRANDE / MS

FUNÇÃO: Valores extensos até quatrilhão(ESpanhol).

Mensagem por joaoalpande »

Obrigado amigo ,muito útil.

cumprimentos
João Alpande
Responder