Função para Validar CPF em Ruby
Função Ruby para validar CPF usando o algoritmo de módulo 11. Pode ser usada em aplicações Rails, Sinatra, scripts ou qualquer projeto Ruby.
Código
def validar_cpf(cpf)
# Remove caracteres não numéricos
cpf = cpf.gsub(/\D/, '')
# Verifica se tem 11 dígitos
return false unless cpf.length == 11
# Rejeita CPFs com todos os dígitos iguais
return false if cpf.chars.uniq.length == 1
# Calcula o primeiro dígito verificador
soma = (0..8).sum { |i| cpf[i].to_i * (10 - i) }
resto = soma % 11
digito1 = resto < 2 ? 0 : 11 - resto
# Calcula o segundo dígito verificador
soma = (0..9).sum { |i| cpf[i].to_i * (11 - i) }
resto = soma % 11
digito2 = resto < 2 ? 0 : 11 - resto
# Verifica se os dígitos calculados conferem
cpf[9].to_i == digito1 && cpf[10].to_i == digito2
end
Análise do código
gsub(/\D/, '') remove tudo que não é dígito, aceitando entrada com ou sem pontuação.
cpf.chars.uniq.length == 1 rejeita CPFs com todos os dígitos iguais usando os métodos idiomáticos de Ruby para arrays.
O cálculo usa Enumerable#sum com bloco: (0..8).sum { |i| cpf[i].to_i * (10 - i) } para o primeiro dígito (pesos 10 a 2) e (0..9).sum { |i| cpf[i].to_i * (11 - i) } para o segundo (pesos 11 a 2). Cada resultado passa por % 11 com o operador ternário para a regra do complemento.
Uso
validar_cpf("529.982.247-25") # => true
validar_cpf("111.111.111-11") # => false
validar_cpf("52998224725") # => true
Testes
Testes com RSpec:
RSpec.describe 'validar_cpf' do
it 'aceita CPF válido com pontuação' do
expect(validar_cpf("529.982.247-25")).to be true
end
it 'aceita CPF válido sem pontuação' do
expect(validar_cpf("52998224725")).to be true
end
it 'rejeita CPF com dígitos repetidos' do
expect(validar_cpf("111.111.111-11")).to be false
end
it 'rejeita CPF com dígito verificador incorreto' do
expect(validar_cpf("529.982.247-26")).to be false
end
it 'rejeita CPF com tamanho incorreto' do
expect(validar_cpf("123.456.789")).to be false
end
end
Precisa de CPFs para alimentar seus specs? Use o gerador de CPF válido online.