Número por Extenso

 

A dica abaixo mostra como exibir um valor por extenso em um label após ser digitado em um edit. Você pode utilizar este código em software de supermercados para impressão de valores em cheques. Vamos a implementação. No Delphi inicie uma nova aplicação e arrume o form1 comforme a figura abaixo:

 

Agora adicione uma nova unit ao projeto, nela conterá as funções para a conversão dos valores. Na unit digite os seguintes códigos:

 

type

  TNumeroStr = string;

 

const

         Unidades: array[1..19] of TNumeroStr = ('um', 'dois', 'três', 'quatro','cinco', 'seis', 'sete', 'oito', 'nove', 'dez', 'onze', 'doze',

         'treze', 'quatorze', 'quinze', 'dezesseis', 'dezessete', 'dezoito','dezenove');

 

         Dezenas: array[1..9] of TNumeroStr = ('dez', 'vinte', 'trinta', 'quarenta','cinqüenta', 'sessenta', 'setenta', 'oitenta', 'noventa');

 

         Centenas: array[1..9] of TNumeroStr = ('cem', 'duzentos', 'trezentos','quatrocentos', 'quinhentos', 'seiscentos', 'setecentos',          'oitocentos','novecentos');

 

         ErrorString = 'Valor fora da faixa';

         Min = 0.01;

         Max = 4294967295.99;

         Moeda = ' real ';

         Moedas = ' reais ';

         Centesimo = ' centavo ';

         Centesimos = ' centavos ';

 

function NumeroParaExtenso(parmNumero: Real): string;

function ConversaoRecursiva(N: LongWord): string;

 

implementation

 

function NumeroParaExtenso(parmNumero: Real): string;

begin

        if (parmNumero >= Min) and (parmNumero <= Max) then

        begin

       {Tratar reais}

                Result := ConversaoRecursiva(Round(Int(parmNumero)));

                if Round(Int(parmNumero)) = 1 then

                    Result := Result + Moeda

                else

                    if Round(Int(parmNumero)) <> 0 then

                       Result := Result + Moedas;

 

                    {Tratar centavos}

                    if not(Frac(parmNumero) = 0.00) then

                    begin

                            if Round(Int(parmNumero)) <> 0 then

                                Result := Result + ' e ';

                                Result := Result + ConversaoRecursiva(Round(Frac(parmNumero) * 100));

                                if (Round(Frac(parmNumero) * 100) = 1) then

                                    Result := Result + centesimo

                                    else

                                            Result := Result + centesimos;

                                end;

                            end

                    else

                    raise ERangeError.CreateFmt('%g ' + ErrorString + ' %g..%g',[parmNumero, Min, Max]);

end;

 

function ConversaoRecursiva(N: LongWord): string;

begin

        case N of

                1..19:

                        Result := Unidades[N];

                20, 30, 40, 50, 60, 70, 80, 90:

                        Result := Dezenas[N div 10] + ' ';

                21..29, 31..39, 41..49, 51..59, 61..69, 71..79, 81..89, 91..99:

                        Result := Dezenas[N div 10] + ' e ' + ConversaoRecursiva(N mod 10);

                100, 200, 300, 400, 500, 600, 700, 800, 900:

                        Result := Centenas[N div 100] + ' ';

                101..199:

                        Result := ' cento e ' + ConversaoRecursiva(N mod 100);

                201..299, 301..399, 401..499, 501..599, 601..699, 701..799, 801..899, 901..999:

                        Result := Centenas[N div 100] + ' e ' + ConversaoRecursiva(N mod 100);

                1000..999999:

                        Result := ConversaoRecursiva(N div 1000) + ' mil ' + ConversaoRecursiva(N mod 1000);

                1000000..1999999:

                        Result := ConversaoRecursiva(N div 1000000) + ' milhão '+ ConversaoRecursiva(N mod 1000000);

                2000000..999999999:

                        Result := ConversaoRecursiva(N div 1000000) + ' milhões '+ ConversaoRecursiva(N mod 1000000);

                1000000000..1999999999:

                        Result := ConversaoRecursiva(N div 1000000000) + ' bilhão ' + ConversaoRecursiva(N mod 1000000000);

                2000000000..4294967295:

                        Result := ConversaoRecursiva(N div 1000000000) + ' bilhões ' + ConversaoRecursiva(N mod 1000000000);

        end;

end;

 

Salve a unit com o nome de unit2. Declare a unit2 na seção uses da unit1 para podermos utilizar as funções de conversão. Dê um duplo clique no botão do formulário e no evento onclick escreva o seguinte código:

 

Label1.Caption := NumeroParaExtenso(StrToFloat(Edit1.Text));

 

Pronto. Execute a aplicação e após digitar um valor no edit, veja o que acontece com o label: