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...: ExtensoEN.PRG
* Autor.....: Jose Carlos da Rocha
*
* O codigo original reside como parte integrante do livro de Jose Ramalho
*
* Proposito: Mostrar valores em extenso em inglês
Function Main()
? EXTENSOEN( 275.49 )
? EXTENSOEN( 100 )
? EXTENSOEN( 999 )
? EXTENSOEN( 1000 )
? EXTENSOEN( 1000000 )
? EXTENSOEN( 1000000000 )
? EXTENSOEN( 1000000000000 )
? EXTENSOEN( 1000000000000.52 )
? EXTENSOEN( 1000000000000000 )
? EXTENSOEN( 3101256786765.45 )
? EXTENSOEN( 1000000.01 )
? EXTENSOEN( 6000000000.01 )
? EXTENSOEN( 2000000000000.00 )
Return Nil
FUNCTION EXTENSOEN( PVALOR )
LOCAL TSTR := STRZERO(ABS(PVALOR),21,2)
LOCAL ACIFRA := {{'Quadrillion','Quadrillions'},;
{'Trillion' ,'Trillions'},;
{'Billion' ,'Billions'},;
{'Million' ,'Millions'},;
{'Thousand' ,'Thousand'},;
{' ' ,' '},;
{'Cent' ,'Cents'}}
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 (TCENTAVOS>0)
TEXTENSO:=" Dollars and " + EXTCEMEN(STRZERO(TCENTAVOS,3)) + ACIFRA[7][IIF(TCENTAVOS=1,1,2)]
ELSE
TEXTENSO:=" Dollars "
ENDIF
ENDIF
FOR TX := 6 TO 1 STEP -1
IF (VAL(TSUBS:=SUBSTR(TSTR,(TX*3)-2,3))>0)
TEXTENSO:=EXTCEMEN(TSUBS)+ACIFRA[TX][IIF(VAL(TSUBS)=1,1,2)]+' '+TEXTENSO
ENDIF
NEXT TX
ENDIF
if "." $ STR(PVALOR)
if ("ILHIO" $ upper(TEXTENSO))
TEXTENSO:=strtran(TEXTENSO," Dollar"," Dollars")
endif
endif
RETURN(STRIPDOUBLE(TEXTENSO,' '))
FUNCTION EXTCEMEN(PCEM)
LOCAL AVAL := {VAL(SUBSTR(PCEM,1,1)),;
VAL(SUBSTR(PCEM,2,1)),;
VAL(SUBSTR(PCEM,3,1))}
LOCAL TTAM,TEXT := ''
LOCAL ACENT := { 'One Hundred','Two Hundred','Three Hundred','Four Hundred','Five Hundred','Six Hundred','Seven Hundred','Eight Hundred','Nine Hundred'}
LOCAL AVINT := { 'Eleven','Twelve','Thirteen','Fourteen','Fifteen','Sixteen','Seventeen','Eighteen','Nineteen' }
LOCAL ADEZ := { 'Ten','Twelve','Thirty','Forty','Fifty','Sixty','Seventy','Eighty','Ninety' }
LOCAL AUNIT := { 'One','Two','Three','Four','Five','Six','Seven','Eight','Nine' }
IF (VAL(PCEM)>0)
IF (VAL(PCEM)==100)
TEXT := 'One Hundred '
ELSE
IF (AVAL[1]>0)
TEXT := ACENT[AVAL[1]]+IIF((AVAL[2]+AVAL[3]>0),' and ',' ')
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,'-','')
ENDIF
TEXT := TEXT+IIF(AVAL[3]>0,' '+AUNIT[AVAL[3]],' ')
ENDIF
ENDIF
ENDIF
RETURN(TEXT := strtran(TEXT,'- ','-')+' ')
FUNCTION STRIPDOUBLE(PSTRING,PCHAR)
WHILE (PCHAR+PCHAR$(PSTRING:=STRTRAN(PSTRING,PCHAR+PCHAR,PCHAR)))
ENDDO
RETURN(PSTRING)


