Módulo para validação, detecção de formato e conversão de placas veiculares brasileiras.
Este módulo fornece funções para:
| Aspecto | Tradicional | Mercosul |
|---|---|---|
| Formato | LLL-NNNN | LLLNLNN |
| Letras | 3 | 3 |
| Números | 4 | 3 (separados) |
| Total caracteres | 7 | 7 |
| Letra de estado | Não | Sim (3º posição após 1 número) |
A letra central da placa Mercosul identifica o estado:
(plate/is-valid? plate-string)
Valida uma placa veicular (tradicional ou Mercosul).
Argumentos:
plate-string (string): Placa a validar, com ou sem hífenRetorna:
true se válida, false caso contrárioExemplos:
(plate/is-valid? "ABC-1234") ; => true (tradicional)
(plate/is-valid? "ABC1234") ; => true (tradicional sem hífen)
(plate/is-valid? "ABC1D23") ; => true (Mercosul)
(plate/is-valid? "ABC-1D23") ; => true (Mercosul com hífen)
(plate/is-valid? "INVALID") ; => false
(plate/is-valid? "123ABCD") ; => false
(plate/get-format plate-string)
Detecta o formato de uma placa (tradicional ou Mercosul).
Argumentos:
plate-string (string): Placa a analisarRetorna:
"LLLNNNN" para placa tradicional"LLLNLNN" para placa Mercosulnil se placa inválidaExemplos:
(plate/get-format "ABC1234") ; => "LLLNNNN" (tradicional)
(plate/get-format "ABC-1234") ; => "LLLNNNN" (tradicional)
(plate/get-format "ABC1D23") ; => "LLLNLNN" (Mercosul)
(plate/get-format "ABC-1D23") ; => "LLLNLNN" (Mercosul)
(plate/get-format "INVALID") ; => nil
(plate/is-traditional? plate-string)
Verifica se a placa é do formato tradicional.
Argumentos:
plate-string (string): Placa a verificarRetorna:
true se for tradicional, false caso contrárioExemplos:
(plate/is-traditional? "ABC1234") ; => true
(plate/is-traditional? "ABC1D23") ; => false
(plate/is-traditional? "INVALID") ; => false
(plate/is-mercosul? plate-string)
Verifica se a placa é do formato Mercosul.
Argumentos:
plate-string (string): Placa a verificarRetorna:
true se for Mercosul, false caso contrárioExemplos:
(plate/is-mercosul? "ABC1D23") ; => true
(plate/is-mercosul? "ABC1234") ; => false
(plate/is-mercosul? "INVALID") ; => false
(plate/convert-to-mercosul traditional-plate)
Converte uma placa tradicional para o formato Mercosul.
Argumentos:
traditional-plate (string): Placa tradicional a converterRetorna:
nil se placa não for válida ou já for MercosulExemplos:
(plate/convert-to-mercosul "ABC1234") ; => "ABC1B34"
(plate/convert-to-mercosul "ABC-1234") ; => "ABC1B34" (remove hífen)
(plate/convert-to-mercosul "ABC1D23") ; => "ABC1D23" (já é Mercosul, retorna igual)
(plate/convert-to-mercosul "INVALID") ; => nil
Algoritmo de Conversão:
Exemplo de conversão: ABC1234 → ABC1B34
(plate/is-valid? "123ABCD") ; => false (números na frente)
(plate/is-valid? "AB12345") ; => false (formato inválido)
(plate/is-valid? "ABC") ; => false (muito curto)
(plate/is-valid? "ABC1234XYZ") ; => false (muito longo)
(defn validate-plate-input [plate-input]
(if (plate/is-valid? plate-input)
{:status :valid
:plate (clojure.string/upper-case plate-input)
:format (plate/get-format plate-input)}
{:status :invalid :message "Placa inválida"}))
(validate-plate-input "ABC1234")
; => {:status :valid :plate "ABC1234" :format "LLLNNNN"}
(validate-plate-input "abc1d23")
; => {:status :valid :plate "ABC1D23" :format "LLLNLNN"}
(defn convert-traditional-to-mercosul [plate-list]
(mapv (fn [plate]
(if (plate/is-traditional? plate)
{:original plate
:converted (plate/convert-to-mercosul plate)
:status :converted}
{:original plate
:converted plate
:status :already-mercosul}))
plate-list))
(convert-traditional-to-mercosul ["ABC1234" "XYZ5678" "DEF1G90"])
; => [{:original "ABC1234" :converted "ABC1B34" :status :converted} ...]
(defn classify-vehicle [plate-string]
(if-let [format (plate/get-format plate-string)]
(case format
"LLLNNNN" {:type :traditional :plate plate-string :status :valid}
"LLLNLNN" {:type :mercosul :plate plate-string :status :valid}
{:type :unknown :plate plate-string :status :invalid})
{:type :unknown :plate plate-string :status :invalid}))
(classify-vehicle "ABC1234") ; => {:type :traditional ...}
(classify-vehicle "ABC1D23") ; => {:type :mercosul ...}
(defn migrate-plate-to-mercosul [vehicle-record]
(let [converted (plate/convert-to-mercosul (:plate vehicle-record))]
(if converted
(assoc vehicle-record
:plate converted
:plate-format :mercosul
:migrated-at (java.time.LocalDateTime/now))
vehicle-record)))
(migrate-plate-to-mercosul {:id 1 :plate "ABC1234" :owner "João"})
; => {:id 1 :plate "ABC1B34" :owner "João" :plate-format :mercosul :migrated-at ...}
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 |