← Back to list

Validação do novo CNPJ alfanumérico em Delphi

A Receita Federal anunciou que a partir de julho de 2026, o CNPJ passará a ser alfanumérico, combinando letras e números e exigindo ajustes…

João Antônio Duarte · 2025-10-16 14:04 · 10 claps · 1.4 min read
#cnpj #delphi
Open on Medium ↗

Validação do novo CNPJ alfanumérico em Delphi

A Receita Federal anunciou que a partir de julho de 2026, o CNPJ passará a ser alfanumérico, combinando letras e números e exigindo ajustes nas rotinas de validação de empresas. O cálculo do dígito verificador seguirá o módulo 11, agora considerando a conversão das letras em valores ASCII. Para evitar rejeições e falhas fiscais, será necessário atualizar regras, bancos de dados e integrações, garantindo compatibilidade com sistemas fiscais e financeiros.

Criei uma função em delphi para verificar se um CNPJ é válido, de acordo com esse novo padrão alfanumérico:

function IsValidCnpj(const ACnpj: string): Boolean;

  function OnlyAlphaNumbers(const S: string): string;
  var
    I: Integer;
  begin
    Result := '';
    for I := 1 to Length(S) do
      if CharInSet(S[I], ['0'..'9', 'A'..'Z']) then
        Result := Result + S[I];
  end;

const
  Multiplier1: array[1..12] of Integer = (5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2);
  Multiplier2: array[1..13] of Integer = (6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2);
  BaseSub: Integer = Ord('0');
var
  Cnpj: string;
  I, Sum, Remainder, Digit1, Digit2: Integer;
  AllEqual: Boolean;
begin
  Cnpj := OnlyAlphaNumbers(ACnpj);

  if Length(Cnpj) <> 14 then
    Exit(False);

  // Verifica se todos os dígitos são iguais
  AllEqual := True;
  for I := 2 to 14 do
    if Cnpj[I] <> Cnpj[1] then
    begin
      AllEqual := False;
      Break;
    end;
  if AllEqual then
    Exit(False);

  // Cálculo do 1º digito verificador
  Sum := 0;
  for I := 1 to 12 do
    Sum := Sum + (Ord(Cnpj[I]) - BaseSub) * Multiplier1[I];
  Remainder := Sum mod 11;
  if Remainder < 2 then
    Digit1 := 0
  else
    Digit1 := 11 - Remainder;

  // Cálculo do 2º digito verificador
  Sum := 0;
  for I := 1 to 13 do
    Sum := Sum + (Ord(Cnpj[I]) - BaseSub) * Multiplier2[I];
  Remainder := Sum mod 11;
  if Remainder < 2 then
    Digit2 := 0
  else
    Digit2 := 11 - Remainder;

  Result := (Ord(Cnpj[13]) - BaseSub = Digit1) and
            (Ord(Cnpj[14]) - BaseSub = Digit2);
end;

메타데이터
post_id
9f60cd97bc23
slug
validação-do-novo-cnpj-alfanumérico-em-delphi-9f60cd97bc23
url
https://medium.com/@joaoduarte19/valida%C3%A7%C3%A3o-do-novo-cnpj-alfanum%C3%A9rico-em-delphi-9f60cd97bc23
canonical_url
https://medium.com/@joaoduarte19/valida%C3%A7%C3%A3o-do-novo-cnpj-alfanum%C3%A9rico-em-delphi-9f60cd97bc23
author_url
https://medium.com/@joaoduarte19
status
ok
fetched_at
2026-06-15 20:49:13