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
Curtir tópico
+ 2
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').
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.
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
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
Clique aqui para fazer login e interagir na Comunidade :)