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') # => falseO 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 comcpf.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.