« 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;


Topics: Delphi, Todos |

Comments