Fórum Mais uma sobre número por extenso #230335

06/05/2004

0

Olá pessoal, sei que essa já tem de monte aqui no
forum, mas nenhuma é como eu preciso.

Preciso de uma função que escreva NÚMEROS por extenso e NÃO
VALORES, compreenderam?
Ex: 1392 deve ser mil trezentos e noventa e dois e não
deve ser mil trezentos e noventa e dois REAIS

Vou usar essa função pra escrever datas completamente por extenso:
06/05/2004
seis de mail de dois mil e quatro

:lol: tem como :?:


Eniorm

Eniorm

Responder

Posts

06/05/2004

Emerson Nascimento

pegue a função de valores por extenso e adapte para atender à sua necessidade.


Responder

Gostei + 0

06/05/2004

Eniorm

8) haha, foi exatamente o que eu fiz!!!
Eu não tinha pensado nisso antes...
o resultado foi o seguinte:

unit Extenso;

interface

uses
     SysUtils;

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;

// removi as definições de reais e centavos
         Moeda = ´ ´;
         Moedas = ´ ´;
         Centesimo = ´ ´;
         Centesimos = ´ ´;

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..1999 : { tive que acrescentar pra não escrever ´um mil...´ }
                        Result := ´ mil ´ + ConversaoRecursiva(N mod 1000);
                2000..999999: { aqui volta para o normal }
                        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;

end.


Taí, talvez sirva pra mais alguém...!
T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar