cnpjcpf.
Código · Ruby

Validar CPF em Ruby

Função sem dependências que valida um CPF pelo módulo 11: limpa a pontuação, descarta sequências repetidas e confere os dois dígitos verificadores. Copie e use.

A função

Ruby
def valid_cpf?(cpf)
  cpf = cpf.gsub(/\D/, '')                                   # mantém só dígitos
  return false if cpf.length != 11 || cpf.chars.uniq.length == 1  # 11 dígitos, não repetidos
  (9..10).each do |i|
    soma = (0...i).sum { |j| cpf[j].to_i * ((i + 1) - j) }
    dv = (soma * 10 % 11) % 10
    return false if dv != cpf[i].to_i
  end
  true
end

valid_cpf?('111.444.777-35') # => true
valid_cpf?('111.444.777-00') # => false

O cálculo é o do módulo 11: cada dígito é multiplicado por um peso decrescente, somado, e o resto da divisão por 11 define o verificador. O laço (9..10) roda uma vez para cada dígito verificador, comparando o resultado com o dígito informado.

Como ler o algoritmo

A linha cpf.chars.uniq.length == 1 descarta sequências repetidas ('11111111111'): se todos os caracteres forem iguais, uniq deixa só um. Já (soma * 10 % 11) % 10 resolve o caso em que o resto seria 10 — ele vira 0, como manda a regra do dígito verificador do CPF.

publicidade

Cuidados

  • Regex só valida formato. Um padrão como /\A\d{11}\z/ confirma que são 11 dígitos, mas não confere o verificador — quem faz isso é a função acima. Veja regex de CPF e CNPJ.
  • Sequências repetidas ('11111111111') passariam no módulo 11, por isso a função as descarta antes com cpf.chars.uniq.length == 1.
  • Válido ≠ existe. A função confirma a consistência matemática, não se o CPF foi emitido a alguém.
  • Guarde sem máscara (só os 11 dígitos) e formate só na exibição.

Continue

Perguntas frequentes

A função precisa de alguma gem?
Não. Usa só regex e métodos de String/Array da biblioteca padrão do Ruby. Se preferir uma gem mantida, há cpf_cnpj (de fnando) e brazilian_documents (de fidelisrafael).
Por que descartar sequências repetidas?
Um CPF como 111.111.111-11 passaria no cálculo do módulo 11, mas é inválido por convenção. A função rejeita antes com cpf.chars.uniq.length == 1.
Validar é o mesmo que existir?
Não. A função confere a consistência matemática dos dígitos verificadores, não se o CPF foi efetivamente emitido a alguém pela Receita Federal.
Código verificado (casos válidos e inválidos). Algoritmo módulo 11 oficial. Revisado em 06/2026.