Java
Validar e gerar CPF em Java
Java 8+. Repare no `\\D` com duas barras: em Java a regex vive dentro de uma String.
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.
public final class Cpf {
private Cpf() {
}
public static boolean valido(String valor) {
if (valor == null) {
return false;
}
String cpf = valor.replaceAll("\\D", "");
// 11 dígitos e nada de sequências repetidas.
if (cpf.length() != 11 || cpf.chars().distinct().count() == 1) {
return false;
}
return dv(cpf, 9) == cpf.charAt(9) - '0'
&& dv(cpf, 10) == cpf.charAt(10) - '0';
}
// Peso posicional: n=9 usa pesos de 10 a 2; n=10, de 11 a 2.
private static int dv(String cpf, int n) {
int soma = 0;
for (int i = 0; i < n; i++) {
soma += (cpf.charAt(i) - '0') * (n + 1 - i);
}
int resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
}
}Geração
Sorteia os nove primeiros dígitos e calcula os verificadores — o mesmo caminho, ao contrário.
import java.security.SecureRandom;
public final class GeradorCpf {
private static final SecureRandom RANDOM = new SecureRandom();
private GeradorCpf() {
}
public static String gerar() {
int[] digitos = new int[11];
for (int i = 0; i < 9; i++) {
digitos[i] = RANDOM.nextInt(10);
}
digitos[9] = dv(digitos, 9);
digitos[10] = dv(digitos, 10);
StringBuilder sb = new StringBuilder(11);
for (int d : digitos) {
sb.append(d);
}
return sb.toString();
}
private static int dv(int[] digitos, int n) {
int soma = 0;
for (int i = 0; i < n; i++) {
soma += digitos[i] * (n + 1 - i);
}
int resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
}
}Uso
Cpf.valido("111.444.777-35"); // true
Cpf.valido("111.111.111-11"); // false
GeradorCpf.gerar(); // "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
JavaScript · TypeScript · Python · PHP · C#