C#
Validar e gerar CPF em C#
C# 8+ / .NET Core 3.1+. Use `RandomNumberGenerator` se precisar de aleatoriedade criptográfica.
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.
using System;
using System.Linq;
using System.Text.RegularExpressions;
public static class Cpf
{
public static bool Valido(string valor)
{
if (string.IsNullOrWhiteSpace(valor))
return false;
var cpf = Regex.Replace(valor, @"\D", "");
// 11 dígitos e nada de sequências repetidas.
if (cpf.Length != 11 || cpf.Distinct().Count() == 1)
return false;
return Dv(cpf, 9) == cpf[9] - '0'
&& Dv(cpf, 10) == cpf[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)
{
var soma = 0;
for (var i = 0; i < n; i++)
soma += (cpf[i] - '0') * (n + 1 - i);
var 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.
using System;
using System.Linq;
public static class GeradorCpf
{
private static readonly Random Random = new Random();
public static string Gerar()
{
var digitos = new int[11];
for (var i = 0; i < 9; i++)
digitos[i] = Random.Next(10);
digitos[9] = Dv(digitos, 9);
digitos[10] = Dv(digitos, 10);
return string.Concat(digitos);
}
private static int Dv(int[] digitos, int n)
{
var soma = 0;
for (var i = 0; i < n; i++)
soma += digitos[i] * (n + 1 - i);
var 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 · Java