Módulo para validação de CNH (Carteira Nacional de Habilitação), incluindo verificação de dígitos verificadores e remoção de símbolos.
O módulo cnh fornece validação completa da Carteira Nacional de Habilitação brasileira (CNH), com suporte a:
Principais capacidades:
A CNH é um número de identificação para condutores de veículos no Brasil com 11 dígitos:
XXXXXXXXXXX
Formato com formatação:
XXXXX.XXXX.XXXX
Características:
A CNH utiliza um algoritmo de validação baseado em módulo:
is-valid?Valida se uma CNH é válida segundo o algoritmo oficial.
Assinatura:
(is-valid? cnh)
Argumentos:
cnh - String com CNH (formatada ou não)Retorna: Boolean - true se for válida, false caso contrário
Exemplos:
(is-valid? "00000000191") ; => true/false (depende de dígito verificador)
(is-valid? "0000000019") ; => false (10 dígitos)
(is-valid? "00000000191111") ; => false (12 dígitos)
(is-valid? nil) ; => false
(is-valid? "") ; => false
(is-valid? "ABCDEFGHIJK") ; => false (caracteres não numéricos)
remove-symbolsRemove todos os caracteres não numéricos de uma CNH.
Assinatura:
(remove-symbols cnh)
Argumentos:
cnh - String com CNH (formatada ou não); nil permitidoRetorna: String contendo apenas dígitos
Exemplos:
(remove-symbols "00000000191") ; => "00000000191"
(remove-symbols "0000.0000.191") ; => "00000000191"
(remove-symbols "0000-0000-191") ; => "00000000191"
(remove-symbols nil) ; => ""
(remove-symbols "") ; => ""
O módulo não lança exceções. Retorna false para entradas inválidas:
;; Formato inválido
(is-valid? "ABCDEFGHIJK") ; => false
(is-valid? "123") ; => false
;; Valores nulos/vazios
(is-valid? nil) ; => false
(is-valid? "") ; => false
;; Dígitos verificadores inválidos
(is-valid? "00000000000") ; => false (dependendo do algoritmo)
;; Números formatados corretamente
(is-valid? "1234.5678.901") ; => true/false (depende de dígito verificador)
(defn validate-cnh-field [value]
(let [cleaned (remove-symbols value)]
(if (is-valid? cleaned)
{:valid? true :cnh cleaned}
{:valid? false :message "CNH inválida"})))
(validate-cnh-field "1234.5678.901")
; => {:valid? true :cnh "12345678901"}
(validate-cnh-field "invalid")
; => {:valid? false :message "CNH inválida"}
(defn normalize-cnh [cnh-input]
(let [cleaned (remove-symbols cnh-input)
trimmed (clojure.string/trim cleaned)]
(when (is-valid? trimmed)
trimmed)))
(normalize-cnh " 1234.5678.901 ")
; => "12345678901"
(normalize-cnh "invalid")
; => nil
(defn validate-drivers [drivers]
(map (fn [driver]
(assoc driver
:cnh-valid? (is-valid? (remove-symbols (:cnh driver)))))
drivers))
(validate-drivers
[{:name "João" :cnh "1234.5678.901"}
{:name "Maria" :cnh "invalid"}
{:name "Pedro" :cnh "9876.5432.109"}])
; => [{:name "João" :cnh-valid? true} ...]
(defn filter-valid-cnhs [cnh-list]
(->> cnh-list
(map remove-symbols)
(filter is-valid?)))
(filter-valid-cnhs
["1234.5678.901"
"invalid"
"9876.5432.109"
nil])
; => ["12345678901" "98765432109"]
(defn register-driver [driver-info]
(let [{:keys [name cnh]} driver-info
clean-cnh (remove-symbols cnh)]
(if (is-valid? clean-cnh)
{:status :success
:driver {:name name :cnh clean-cnh}}
{:status :error
:message "CNH inválida para registro"})))
(register-driver {:name "João Silva" :cnh "1234.5678.901"})
; => {:status :success :driver {...}}
(defn are-same-cnh? [cnh1 cnh2]
(let [clean1 (remove-symbols cnh1)
clean2 (remove-symbols cnh2)]
(and (is-valid? clean1)
(is-valid? clean2)
(= clean1 clean2))))
(are-same-cnh? "1234.5678.901" "12345678901")
; => true
(are-same-cnh? "1234.5678.901" "9876.5432.109")
; => false
| Formato | Exemplo | Válido |
|---|---|---|
| Sem formatação | 12345678901 | ✅ |
| Com pontos | 1234.5678.901 | ✅ |
| Com hífens | 1234-5678-901 | ✅ |
| Misto | 1234.5678-901 | ✅ |
| Com espaços | 1234 5678 901 | ✅ |
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |