segunda-feira, 21 de setembro de 2009

Transformar literal em extenso

Function Extenso(literal: Double): string;
var
i, centena, dezena, unidade : integer;
valor, monta, extenso : string;
begin
extenso:='';
if literal=0.00 then
result:='zero'
else
begin
valor:=FormatFloat('000000000000.00',literal);
i:=1;
while i<=13 do
begin
if (Pos(valor[i],'0123456789')=0) then valor[i ] := '0';
if (Pos(valor[i+1],'0123456789')=0) then valor[i+1] := '0';
if (Pos(valor[i+2],'0123456789')=0) then valor[i+2] := '0';
if (i=13) then
centena:=0
else
centena := StrToInt(valor[i]);
dezena := StrToInt(valor[i+1]);
if dezena>1 then
unidade := StrToInt(valor[i+2])
else
unidade := StrToInt(copy(valor,(i+1),2));
if (((i=13) and (StrToFloat(copy(valor,14,2))>0.01)) and ((StrToFloat(copy(valor,1,12)))<>0.00)) then
extenso:=Trim(extenso)+' e';
monta:='duzentos trezentos quatrocentosquinhentos seiscentos setecentos oitocentos novecentos';
if ((dezena+unidade)=0) then
monta:=' cem '+monta
else
monta:=' cento '+monta;
extenso:=Trim(extenso)+' '+Trim(copy(monta,((centena*12)+1),12));
if ((centena<>0) and ((dezena+unidade)>0)) then
extenso:=Trim(extenso)+' e';
monta:=' vinte trinta quarenta cincoentasessenta setenta oitenta noventa';
extenso:=Trim(extenso)+' '+Trim(copy(monta,((dezena*9)+1),9));
if ((dezena>1) and (unidade>0)) then
extenso:=Trim(extenso)+' e';
monta:=' um dois tres quatro cinco seis sete oito nove dez onze doze treze quatorze quinze dezeseis dezesete dezoito dezenove';
extenso:=Trim(extenso)+' '+Trim(copy(monta,((unidade*9)+1),9));
if ((centena+dezena+unidade)>0) then
begin
if i=1 then
if (((centena+dezena)=0) and (unidade<=1)) then
extenso:=Trim(extenso)+' bilhão'
else
extenso:=Trim(extenso)+' bilhões';
if (i=4) then
if ((centena+dezena=0) and (unidade<=1))then
extenso:=Trim(extenso)+' milhão'
else
extenso:=Trim(extenso)+' milhões';
if i=7 then
extenso:=Trim(extenso)+' mil';
if ((i<10) and (StrToFloat(copy(valor,(i+3),(13-i)))>1.00))then
extenso:=extenso+' e';
end;
if ((i=1) and (StrToFloat(copy(valor,4,9))=0.00) and ((centena+unidade+dezena)<>0)) then
extenso:=Trim(extenso)+' de';
if ((i=4) and (StrToFloat(copy(valor,7,6))=0.00) and ((centena+unidade+dezena)<>0)) then
extenso:=Trim(extenso)+' de';
if ((i=10) and (StrToFloat(copy(valor,1,12))<>0.00)) then
if (StrToFloat(copy(valor,1,12))=1.00) then
extenso:=Trim(extenso)+' real'
else
extenso:=Trim(extenso)+' reais';
if ((i=13) and ((dezena+unidade)<>0)) then
if ((dezena+unidade)=1) then
extenso:=Trim(extenso)+' centavo'
else
extenso:=Trim(extenso)+' centavos';
i:=i+3;
end;
if literal<0.00 then extenso:=Trim(extenso)+' negativo';
if (literal<1.0) then
if (StrToInt(copy(valor,14,2))=1) then
extenso:=Trim(extenso)+' de real' // "de real/de reais" podem ser substituidos por campos de arquivos de parametros
else // o que dá mais flexibilidade, caso aconteçam mais planos econômicos.
extenso:=Trim(extenso)+' de reais';
result:=extenso;
end;
end;

Nenhum comentário:

Postar um comentário