Baixei essa unit e funciona perfeitamente

Unit UExtenso;
Interface

Type  TipoFloat = Real; {Qual tipo de variavel representa dinheiro}

Const PrimeiraLetraMaiuscula : Boolean = True;
      {A funcao Dinheiro_Extenso retorna a primeira letra do
       string em maiuscula (no caso de True). Mudar para False
       se nao quiser isto.}

function Dinheiro_Extenso(Numero:TipoFloat):String;
{
 Converte um valor em dinheiro para seu correspondente em Portugues
 Aceita valores entre 0 e 999999.99
 Retorna string nulo se o numero ultrapassar estes limites
}

function Integer_Extenso(Numero:LongInt):String;
{
 Converte um numero inteiro para seu correspondente em Portugues
 Aceita valores entre 0 e 999999
 Retorna string nulo se o numero ultrapassar estes limites
}

function Primeira_Maiuscula(Palavra:String):String;
{
 Transforma a primeira letra da Palavra em letra maiuscula,
 nao altera o restante da Palavra
}

{
 As seguintes constantes sao utilizadas para a composicao
 do nome do numero. Podem ser alteradas no programa que as
 utiliza ANTES de chamar as funcoes anteriores.
}

Const
      NomeJuncao    : String = ' e '; {Exemplo: cento e dois}
                                      {              ^^^    }
      NomeMilhares  : String = ', ';  {Exemplo: um mil, duzentos e trinta}
                                      {               ^^                 }

      {Nomes da moeda: unidade (singular e plural), centesimos (singular
                       e plural) e quando for 0.00}
      NomeDinheiro  : array[1..5] of String =
                      ({1}'real',{2}'reais',{3}'centavo',{4}'centavos',
                       {5}'nenhum real');

      NumeroDeNomes = 39; {NAO e' conveniente alterar este numero!}

      {Nomes de alguns numeros (sem acentos). Pode ser colocada a
       acentuacao, se necessario, alterando os valores das constantes.
       Ver, por exemplo, comentario seguinte com a acentuacao para
       Windows95/Nt. Nao deve ser alterada a ordem dos numeros!}
      NomesDosNumeros : array[1..NumeroDeNomes] of String =
            ({1}'um', {2}'dois', {3}'tres', {4}'quatro', {5}'cinco',
             {6}'seis', {7}'sete', {8}'oito', {9}'nove', {10}'dez',
             {11}'onze', {12}'doze',{13}'treze',{14}'quatorze',{15}'quinze',
             {16}'dezesseis',{17}'dezessete',{18}'dezoito',{19}'dezenove',
             {20}'vinte', {21}'trinta', {22}'quarenta', {23}'cinquenta',
             {24}'sessenta', {25}'setenta', {26}'oitenta', {27}'noventa',
             {28}'cento', {29}'duzentos', {30}'trezentos', {31}'quatrocentos',
             {32}'quinhentos', {33}'seiscentos', {34}'setecentos',
             {35}'oitocentos', {36}'novecentos', {37}'mil',
{Excecoes da regra}   {38}'zero',
                      {39}'cem'
             );

(* Acentos em Windows95/NT {Basicamente 3 e 50}
      NomesDosNumeros : array[1..NumeroDeNomes] of String =
            ({1}'um', {2}'dois', {3}'três', {4}'quatro', {5}'cinco',
             {6}'seis', {7}'sete', {8}'oito', {9}'nove', {10}'dez',
             {11}'onze', {12}'doze',{13}'treze',{14}'quatorze',{15}'quinze',
             {16}'dezesseis',{17}'dezessete',{18}'dezoito',{19}'dezenove',
             {20}'vinte', {21}'trinta', {22}'quarenta', {23}'cinqüenta',
             {24}'sessenta', {25}'setenta', {26}'oitenta', {27}'noventa',
             {28}'cento', {29}'duzentos', {30}'trezentos', {31}'quatrocentos',
             {32}'quinhentos', {33}'seiscentos', {34}'setecentos',
             {35}'oitocentos', {36}'novecentos', {37}'mil',
{Excecoes da regra}   {38}'zero',
                      {39}'cem'
             );
*)

Implementation

Const InteiroMinimo : LongInt = 0;      {menor numero inteiro admissivel}
      InteiroMaximo : LongInt = 999999; {maior numero inteiro admissivel}
      TresMaximo    : LongInt = 999;    {maior numero inteiro c/ 3 digitos}

procedure JuntaAntes(NovaParte,Juncao:String; Var Antigo:String);
{Junta a NovaParte com Antigo usando Juncao se o Antigo nao
 for vazio}
begin
   if length(NovaParte)>0 then
   if length(Antigo)>0 then Antigo:=NovaParte+Juncao+Antigo
                       else Antigo:=NovaParte
end;

procedure JuntaDepois(NovaParte,Juncao:String; Var Antigo:String);
{Junta a NovaParte com Antigo usando Juncao se o Antigo nao
 for vazio}
begin
   if length(NovaParte)>0 then
   if length(Antigo)>0 then Antigo:=Antigo+Juncao+NovaParte
                       else Antigo:=NovaParte
end;

function TresDigitos_Extenso(Numero:LongInt):String;
{Converte tres digitos para extenso}
Var Temporario:String;
    Dezena, Digito : Integer;
begin
   Numero:=Numero mod 1000; {fica somente com os ultimos 3 digitos}
   Temporario:=''; {zera variavel auxiliar}
   if (Numero>=InteiroMinimo)and(Numero<=TresMaximo) then {Numero OK}
   if Numero=100 then Temporario:=NomesDosNumeros[39] {excecao} else
   begin {Numero de 3 digitos valido}
      Dezena:=Numero mod 100; {ultimos dois digitos}
      if (Dezena in [1..20]) then Temporario:=NomesDosNumeros[Dezena] else
      begin {ultimos dois digitos maiores do que 20}
         Digito:=Dezena mod 10; {digito da unidade}
         if Digito>0 then 
JuntaAntes(NomesDosNumeros[Digito],NomeJuncao,Temporario);
         Digito:=Dezena div 10; {digito da dezena}
         if Digito>0 then 
JuntaAntes(NomesDosNumeros[18+Digito],NomeJuncao,Temporario);
      end;
      Digito:=Numero div 100; {digito da centena}
      if Digito>0 then 
JuntaAntes(NomesDosNumeros[27+Digito],NomeJuncao,Temporario);
   end;
   TresDigitos_Extenso:=Temporario
end;

function Integer_Extenso(Numero:LongInt):String;
{Converte um numero inteiro para extenso}
var Temporario,Auxiliar:String;
    Fim, Comeco:LongInt;
begin
   Temporario:=''; {Numero invalido? Retorna string vazio!}
   if (Numero>=InteiroMinimo)and(Numero<=InteiroMaximo)
   then {E' zero?} if Numero=0 then Temporario:=NomesDosNumeros[38] else
   begin
      Fim:=Numero mod 1000; {ultimos 3 digitos}
      Temporario:=TresDigitos_Extenso(Fim);
      Comeco:=Numero div 1000; {primeiros 3 digitos}
      if Comeco>0 then
      begin
         Auxiliar:=TresDigitos_Extenso(Comeco)+' '+NomesDosNumeros[37];
         if Fim>100 then JuntaAntes(Auxiliar,NomeMilhares,Temporario)
                    else JuntaAntes(Auxiliar,NomeJuncao,Temporario)
      end
   end;
   Integer_Extenso:=Temporario
end;

function Dinheiro_Extenso(Numero:TipoFloat):String;
Var Inteiro,Centavo:LongInt;
    Temporario,Auxiliar:String;
begin
   Inteiro:=Trunc(Numero);
   Centavo:=Round(100*frac(Numero));
   if (Inteiro>0)or(Centavo>0) then
   begin
      Temporario:='';
      if Inteiro<=InteiroMaximo then
      begin
         if Inteiro>0 then
         begin
            Temporario:=Integer_Extenso(Inteiro);
            if Inteiro>1 then Temporario:=Temporario+' '+NomeDinheiro[2]
                         else Temporario:=Temporario+' '+NomeDinheiro[1];
         end;
         if Centavo>0 then
         begin
            Auxiliar:=Integer_Extenso(Centavo);
            JuntaDepois(Auxiliar,NomeJuncao,Temporario);
            if Centavo>1 then Temporario:=Temporario+' '+NomeDinheiro[4]
                      else Temporario:=Temporario+' '+NomeDinheiro[3];
         end
      end
   end else Temporario:=NomeDinheiro[5];
   if PrimeiraLetraMaiuscula then
      Temporario:=Primeira_Maiuscula(Temporario);
   Dinheiro_Extenso:=Temporario
end;

function Primeira_Maiuscula(Palavra:String):String;
var i:integer;
begin
   if length(Palavra)>0 then
   begin
      i:=1;
      while (i<=length(Palavra))and(Palavra[i]=' ') do inc(i);
      if i<=length(Palavra) then Palavra[i]:=UpCase(Palavra[i]);
   end;
   Primeira_Maiuscula:=Palavra
end;

END.



  ----- Original Message ----- 
  From: Marcelo 
  To: delphi-br@yahoogrupos.com.br 
  Sent: Wednesday, January 09, 2008 6:55 PM
  Subject: [delphi-br] Valor R$ por extenso


  Boa noite,

  Peguei alguns exemplos na internet, mas não funcionaram como eu 
  esperava, uma jogava tudo misturado e outra não compilava, parava na 
  criação de uma variável TCanvas, alguém poderia me indicar um material 
  para estudo, ou uma luz por gentileza.

  Mantenho todos os e-mails desta e de outras listas em pastas desde 
  2005, para freqüentes pesquisas pelo conteúdo, tem sido de grande 
  ajuda e assim evito incomodar vcs com perguntas que já foram 
  respondidas, mas esta não achei.

  Se alguém puder me ajudar, desde já muito obrigado vcs são 10.

  Marcelo
  [EMAIL PROTECTED]



   


------------------------------------------------------------------------------
  E-mail classificado pelo Identificador de Spam Inteligente.
  Para alterar a categoria classificada, visite o Terra Mail 


[As partes desta mensagem que não continham texto foram removidas]

Responder a