« Identação e Object Pascal Style Guide | Home | EFD prorrogado para 01/2009 (COTEPE 11/07) »
Função para validar CNPJ e CPF (mais um código)
By Paulo (CincoBytes) | December 28, 2007
Se você é um dos muitos desenvolvedores de aplicativos comerciais/fiscais com certeza você tem uma função para validar CNPJ e/ou CPF. Acho que esta função é uma das coisas mais fácil de para encontrar na internet, existem muitos códigos para isso, mas mesmo assim resolvi escrever a minha função (algoritmo), ficou com um numero menor de linhas (respeitando a identação e quebra de linhas), se bem que o numero de linhas não é tão importante assim.

function CnpjCpf(numero: string): boolean;
var
i, s0, d1, d2: SmallInt;
n: string;
begin
// Copyright: www.cincobytes.net / suporte@cincobytes.net //
for i := 1 to length(numero) do
if numero[i] in ['0'..'9'] then
n := n + numero[i];
numero := Copy('00000000000000' + n,
length('00000000000000' + n) - 13, 14);
s0 := 0;
d1 := 0;
d2 := 0;
for i := 1 to 28 do
begin
if length(n) = 14 then
s0 := s0 + StrToInt(Copy(numero + numero, i, 1)) *
(StrToInt(Copy('4321876543210054321876543200', i, 1)) + 1);
if length(n) = 11 then
s0 := s0 + StrToInt(Copy(numero + numero, i, 1)) *
(StrToInt(Copy('0008765432100000098765432100', i, 1)) + 2);
if (i = 12) and ((11 - (s0 mod 11)) < 10) then
d1 := 11 - (s0 mod 11);
if (i = 14) then
s0 := d1 * 2;
if (i = 26) and ((11 - (s0 mod 11)) < 10) then
d2 := 11 - (s0 mod 11);
end;
result := ((length(n) in [11, 14]) and
(StrToInt(copy(numero, 13, 2)) = (d1 * 10 + d2)));
end;
