Buscar

Transformar literal em extenso

Código

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;

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Object pascal
Adicionada dia: 24/06/03
Por: Felipe Monteiro
Visualizada: 2995 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009