JavaScript
Validar e gerar CPF em JavaScript
Funciona igual no Node e no navegador. Não depende de nenhum pacote.
Validação
A função devolve true apenas quando o número tem 11 dígitos, não é uma sequência repetida e os dois dígitos verificadores conferem.
export function validarCPF(valor) {
const cpf = String(valor ?? '').replace(/\D/g, '');
// Precisa ter 11 dígitos e não pode ser uma sequência repetida.
// Atenção: 111.111.111-11 passa no módulo 11, por isso o teste explícito.
if (cpf.length !== 11) return false;
if (/^(\d)\1{10}$/.test(cpf)) return false;
// Peso posicional: com n = 9 os pesos vão de 10 a 2; com n = 10, de 11 a 2.
const dv = (n) => {
let soma = 0;
for (let i = 0; i < n; i++) soma += Number(cpf[i]) * (n + 1 - i);
const resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
};
return dv(9) === Number(cpf[9]) && dv(10) === Number(cpf[10]);
}Geração
Sorteia os nove primeiros dígitos e calcula os verificadores — o mesmo caminho, ao contrário.
export function gerarCPF() {
const base = Array.from({ length: 9 }, () => Math.floor(Math.random() * 10));
const dv = (digitos) => {
const soma = digitos.reduce((acc, d, i) => acc + d * (digitos.length + 1 - i), 0);
const resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
};
const d1 = dv(base);
const d2 = dv([...base, d1]);
return [...base, d1, d2].join('');
}Uso
validarCPF('111.444.777-35'); // true
validarCPF('111.111.111-11'); // false
gerarCPF(); // '52998224725'Os dois pontos em que essas funções costumam quebrar
Toda implementação de CPF erra nos mesmos dois lugares, e as duas armadilhas estão tratadas no código acima:
- Resto 0 ou 1. Quando o resto da divisão por 11 é menor que 2, o dígito verificador é
0— e não11 - resto, que daria 10 ou 11. Pular essa regra faz o validador rejeitar cerca de um terço dos CPFs legítimos. - Dígitos repetidos.
111.111.111-11e as outras nove sequências iguais passam na conta do módulo 11. Como são exatamente o que se digita para testar um formulário, precisam de uma verificação à parte.
A explicação completa da aritmética, com exemplo resolvido dígito a dígito, está emcomo validar um CPF.
Números para testar
Para exercitar a função com dados de verdade, o gerador produz até 1000 CPFs válidos por vez e exporta em .txt, .csv ou .json — pronto para virar fixture do seu conjunto de testes.
Casos que vale incluir na suíte: 111.444.777-35 (válido),111.111.111-11 (repetido, deve falhar), 123 (curto demais) e uma string vazia.
Outras linguagens
TypeScript · Python · PHP · Java · C#