Função para validar CAEPF (Delphi)

21/07/2020

0

Segue uma função para validar CAEPF (Delphi):

function TestaCAEPF(nr:string):boolean;
var
  d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14 : integer;
  PriDig, SegDig, rest1,rest2, resultado1,resultado2, DV, DVPassado : integer;
begin

if length(nr)<>14 then
   begin
   result := false;
   exit;
   end;

d1 := strtoint(copy(nr,1,1));
d2 := strtoint(copy(nr,2,1));
d3 := strtoint(copy(nr,3,1));
d4 := strtoint(copy(nr,4,1));
d5 := strtoint(copy(nr,5,1));
d6 := strtoint(copy(nr,6,1));
d7 := strtoint(copy(nr,7,1));
d8 := strtoint(copy(nr,8,1));
d9 := strtoint(copy(nr,9,1));
d10 := strtoint(copy(nr,10,1));
d11 := strtoint(copy(nr,11,1));
d12 := strtoint(copy(nr,12,1));

d13 := strtoint(copy(nr,13,1));
d14 := strtoint(copy(nr,14,1));


resultado1:=(d12*9+d11*8+d10*7+d9*6+d8*5+d7*4+d6*3+d5*2+d4*9+d3*8+d2*7+d1*6);
rest1 := resultado1 mod 11;
if(rest1=10) then rest1:=0;

resultado2:=(rest1*9+d12*8+d11*7+d10*6+d9*5+d8*4+d7*3+d6*2+d5*9+d4*8+d3*7+d2*6+d1*5);
rest2 := resultado2 mod 11;
if(rest2=10) then rest2:=0;

DV:= (rest1*10+rest2) + 12;
if(DV>99) then DV:=DV-100;

DVPassado:= d13*10 + d14;

result := DVPassado = DV;
end;
Marcelo

Marcelo

Responder

Post mais votado

21/07/2020

bacana, Marcelo. Outra versão dessa mesma função (a base foi a tua, mas tentei deixar o código menos 'verboso').
function TestaCAEPF(nr:string): boolean;
const
  mult1: array[1..12] of integer = (6, 7, 8, 9, 2, 3, 4, 5, 6, 7, 8, 9);
  mult2: array[1..12] of integer = (5, 6, 7, 8, 9, 2, 3, 4, 5, 6, 7, 8);
var
  i, DVPassado, DVCalculado: integer;
  rest1, rest2, resultado1, resultado2: integer;
begin
  result := false;
  if length(nr) = 14 then
  begin
    DVPassado := strtoint(copy(nr,13,2));

    resultado1 := 0;
    for i := Low(mult1) to High(mult1) do
      Inc(resultado1, (strtoint(nr[i]) * mult1[i]));

    rest1 := resultado1 mod 11;
    if(rest1=10) then rest1 := 0;

    resultado2 := (rest1 * 9);
    for i := Low(mult2) to High(mult2) do
      Inc(resultado2, (strtoint(nr[i]) * mult2[i]));

    rest2 := resultado2 mod 11;
    if(rest2=10) then rest2 := 0;

    DVCalculado := ((rest1*10) + rest2) + 12;
    if(DVCalculado > 99) then Dec(DVCalculado, 100);

    result := (DVPassado = DVCalculado);
  end;
end;

dica: uma string é um array de char, então você não precisa usar a função copy() para pegar a letra de uma posição da string; você pode ir direto na posição. no caso nr[5] retorna a quinta letra da string; nr[13] a décima terceira letra.


Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

21/07/2020

Emerson Nascimento

complementando sobre a string ser um array de char: é um array baseado em 1, logo inicia em 1, e não em 0, como normalmente acontece com os arrays em Delphi.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar