CNH
O número de registro da Carteira Nacional de Habilitação.
Validar
- JavaScript, biblioteca
- Python, biblioteca5 casos falham
- Go, biblioteca3 casos falham
- Ruby, biblioteca3 casos falham
- Rust, biblioteca3 casos falham
- .NET, biblioteca3 casos falham
- Erlang, biblioteca5 casos falham
Valida um número de registro da CNH: 9 dígitos mais 2 dígitos verificadores (Resolução CONTRAN nº 886/2021, art. 4º).
- A função ignora espaços, pontos, hifens e barras, em qualquer quantidade e posição (
000000001/19e000000001-19são lidos como00000000119). Qualquer outro caractere torna o valor inválido. Até a 2.4.0 uma barra tornava o valor inválido. - Rejeita um valor com os 11 dígitos iguais.
- São exigidos exatamente 11 dígitos depois de removidos os caracteres ignorados.
- Só uma string é lida. Qualquer outro tipo retorna
false. - Nenhum texto oficial publica os pesos dos dígitos verificadores. A Resolução CONTRAN nº 886/2021, art. 4º, e a Resolução CONTRAN nº 1.020/2025, art. 10, dão só o leiaute (9 caracteres e 2 dígitos verificadores). O algoritmo segue uma referência da comunidade.
Decisão pendente
A referência (JS) mantém um resto 1 no primeiro dígito verificador como 1, como fazem os números de registro reais (o art. 4º § 1º diz 0). Python e Erlang usam um algoritmo diferente (de 2022). Veja a decisão em aberto em docs/findings.md (em inglês).
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | boolean |
Valida uma CNH. Espaços, pontos, hífens e barras são ignorados; qualquer outro caractere invalida o valor.
- Um valor cujos 11 dígitos são todos iguais é rejeitado, então
'11111111111'é inválido. - O primeiro dígito verificador mantém o resto 1 como
1, como nos números reais de registro. O art. 4º, § 1º, da Resolução CONTRAN nº 886/2021, em que o resto 0 ou 1 dá0, fala em "O dígito verificador" sem dizer de qual número: escrito no singular logo depois do Número do Espelho da CNH (o único número do artigo com um só dígito verificador), ele se lê melhor como a regra desse dígito, mas a redação é genérica e não traz pesos, então não serve de fonte para os 2 dígitos verificadores do número de registro; nenhum texto oficial publica os pesos deles. As Resoluções CONTRAN nº 976/2022, nº 998/2023 e nº 1.006/2024 alteram a Resolução nº 886/2021, nenhuma delas no art. 4º. A Resolução CONTRAN nº 1.020/2025, a norma de habilitação mais nova, repete o layout no art. 10 ("nove caracteres e dois dígitos verificadores") sem regra de dígito verificador e não revoga a 886 (art. 140).
import { isValidCnh } from '@brazilian-utils/brazilian-utils';
isValidCnh('00000000119'); // true
isValidCnh('000000001-19'); // true (hífen antes dos dígitos verificadores)
isValidCnh('ab00000000119'); // false (letras são rejeitadas)Fonte: Resolução CONTRAN nº 886/2021, art. 4º, Resolução CONTRAN nº 1.020/2025, art. 10; pesos conforme o siga0984.
Código: brazilian-utils/javascriptTeste com JavaScript isValidCnh
Casos de teste compartilhados (26) e o resultado em cada biblioteca cnh.isValid
Formatar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca11 casos falham
- Rust, biblioteca
- .NET, biblioteca1 caso falha
- Erlang, biblioteca
Formata um número de CNH como 000000000-00 (9 dígitos, hífen, 2 dígitos verificadores).
options.padprimeiro completa o valor com zeros à esquerda até 11 dígitos.options.obfuscate(padrãofalse) oculta com*os 3 primeiros dígitos e os 2 dígitos verificadores, depois do preenchimento:***503064-**. Funciona junto compade em um valor parcial. Comopad, é lido como verdadeiro ou falso: um não booleano como1também oculta os dígitos, e0não oculta.- Nenhuma autoridade publica uma regra de mascaramento para a CNH. A regra é uma analogia com a que as Leis de Diretrizes Orçamentárias fixam para publicar um CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores", Lei nº 12.309/2010, art. 87, § 5º, repetida até a LDO 2026, Lei nº 15.321/2025, art. 163), não uma norma publicada.
cns.formatepassport.formatnão têm a opçãoobfuscate.- Um número só é lido se for um inteiro seguro não negativo. Número negativo, fracionário, não finito ou inseguro retorna uma string vazia (a 2.4.0 lia os dígitos de qualquer número, descartando sinal e ponto decimal).
- Um valor sem dígitos (vazio, ou só letras e símbolos) retorna uma string vazia mesmo com
options.pad. Até a 2.4.0,padretornava a máscara inteira de zeros (000000000-00). - Os dígitos depois do 11º são descartados.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | number | sim |
options | FormatCnhOptions | não |
options.pad | boolean | não |
options.obfuscate | boolean | não |
| retorna | string |
Formata uma CNH.
- Opções (
FormatCnhOptions):padcompleta o valor com zeros à esquerda até os 11 dígitos antes de aplicar a máscara (padrãofalse);obfuscateesconde os 3 primeiros dígitos e os 2 dígitos verificadores. Um valor vazio, ou sem dígitos, devolve''mesmo compad. - O
obfuscateé aplicado depois dopad. - Nenhuma autoridade publica uma regra de mascaramento para a CNH, então o
obfuscateusa a que as Leis de Diretrizes Orçamentárias definem para a divulgação do CPF ("ocultar os três primeiros dígitos e os dois dígitos verificadores", Lei nº 14.194/2021, art. 149, regra criada pela Lei nº 12.309/2010, art. 87, § 5º), um número com a mesma estrutura.
import { formatCnh } from '@brazilian-utils/brazilian-utils';
formatCnh('02650306461'); // 026503064-61
formatCnh('2650306461', { pad: true }); // 026503064-61
formatCnh('02650306461', { obfuscate: true }); // ***503064-**Teste com JavaScript formatCnh
Casos de teste compartilhados (28) e o resultado em cada biblioteca cnh.format
Interpretar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca2 casos falham
- Rust, biblioteca
- .NET, biblioteca1 caso falha
- Erlang, biblioteca
Remove a formatação da CNH e mantém apenas os dígitos, com no máximo 11 dígitos (os dígitos depois do 11º são descartados).
- Um número só é lido se for um inteiro seguro não negativo. Número negativo, fracionário, não finito ou inseguro retorna uma string vazia (a 2.4.0 lia os dígitos de qualquer número, descartando sinal e ponto decimal).
- Um valor sem dígitos retorna uma string vazia.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | number | sim |
| retorna | string |
Remove a formatação da CNH, mantém apenas os dígitos e limita o resultado a 11 dígitos.
import { parseCnh } from '@brazilian-utils/brazilian-utils';
parseCnh('026503064-61'); // '02650306461'Teste com JavaScript parseCnh
Casos de teste compartilhados (9) e o resultado em cada biblioteca cnh.parse
Gerar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
Gera um número de CNH aleatório e válido: 11 dígitos, sem máscara, que cnh.isValid aceita.
- Os 9 dígitos base nunca são todos iguais.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
| retorna | string |
Gera uma CNH válida aleatória.
import { generateCnh } from '@brazilian-utils/brazilian-utils';
generateCnh(); // '02650306461'Fonte: Lei nº 14.194/2021, art. 149, a regra de mascaramento do CPF que o obfuscate toma emprestada, criada pela Lei nº 12.309/2010, art. 87, § 5º e repetida pelas LDOs seguintes (a de 2026, Lei nº 15.321/2025, art. 163, a repete).
Teste com JavaScript generateCnh
Casos de teste compartilhados (1) e o resultado em cada biblioteca cnh.generate
Fontes oficiais
Atualizado em
