Ferramentas / Validador de RENAVAM

Validador de RENAVAM

Digite o RENAVAM do veículo e veja na hora se o tamanho e o dígito verificador estão corretos.

    Processamento local: nada do que você digita sai do seu navegador.

    Como usar

    Digite o RENAVAM, que aparece no CRLV. O padrão atual tem 11 dígitos; números antigos de 9 ou 10 dígitos são completados com zeros à esquerda antes da conta. O resultado aparece enquanto você digita.

    Como o dígito verificador é calculado

    Multiplicam-se os 10 primeiros dígitos pelos pesos 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 e somam-se os produtos. A soma multiplicada por 10, dividida por 11, deixa um resto: esse é o dígito verificador, e se for 10 vira 0.

    Isso só mostra que o número é consistente. A ferramenta não consulta o Detran nem o Senatran, então não confirma que o veículo existe, de quem é, nem sua situação.

    Como implementar em código

    Exemplos prontos para usar no seu projeto.

    // RENAVAM: 11 dígitos (os antigos, de 9, ganham zeros à esquerda)
    function renavamValido(valor) {
      let n = String(valor).replace(/\D/g, '');
      if (n.length < 9 || n.length > 11) return false;
      n = n.padStart(11, '0');
      if (/^(\d)\1{10}$/.test(n)) return false;
      const pesos = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
      const soma = pesos.reduce((acc, p, i) => acc + p * Number(n[i]), 0);
      let dv = (soma * 10) % 11;
      if (dv === 10) dv = 0;
      return dv === Number(n[10]);
    }
    
    console.log(renavamValido('86769597308')); // true
    import re
    
    def renavam_valido(valor: str) -> bool:
        """RENAVAM: 11 dígitos (os antigos, de 9, ganham zeros à esquerda)."""
        n = re.sub(r"\D", "", valor)
        if not 9 <= len(n) <= 11:
            return False
        n = n.zfill(11)
        if len(set(n)) == 1:
            return False
        pesos = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
        soma = sum(p * int(c) for p, c in zip(pesos, n))
        dv = (soma * 10) % 11
        if dv == 10:
            dv = 0
        return dv == int(n[10])
    
    print(renavam_valido("86769597308"))  # True
    import (
    	"regexp"
    	"strings"
    )
    
    var naoDigito = regexp.MustCompile(`\D`)
    
    // RenavamValido valida o RENAVAM (11 dígitos; os de 9 ganham zeros à esquerda).
    func RenavamValido(valor string) bool {
    	n := naoDigito.ReplaceAllString(valor, "")
    	if len(n) < 9 || len(n) > 11 {
    		return false
    	}
    	n = strings.Repeat("0", 11-len(n)) + n
    	pesos := []int{3, 2, 9, 8, 7, 6, 5, 4, 3, 2}
    	soma, repetido := 0, true
    	for i := 0; i < 11; i++ {
    		if n[i] != n[0] {
    			repetido = false
    		}
    		if i < 10 {
    			soma += pesos[i] * int(n[i]-'0')
    		}
    	}
    	if repetido {
    		return false
    	}
    	dv := (soma * 10) % 11
    	if dv == 10 {
    		dv = 0
    	}
    	return dv == int(n[10]-'0')
    }
    /// RENAVAM: 11 dígitos (os antigos, de 9, ganham zeros à esquerda).
    bool renavamValido(String valor) {
      var n = valor.replaceAll(RegExp(r'\D'), '');
      if (n.length < 9 || n.length > 11) return false;
      n = n.padLeft(11, '0');
      if (RegExp(r'^(\d)\1{10}$').hasMatch(n)) return false;
      const pesos = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
      var soma = 0;
      for (var i = 0; i < 10; i++) {
        soma += pesos[i] * int.parse(n[i]);
      }
      var dv = (soma * 10) % 11;
      if (dv == 10) dv = 0;
      return dv == int.parse(n[10]);
    }
    final class Validador {
        /** RENAVAM: 11 dígitos (os antigos, de 9, ganham zeros à esquerda). */
        static boolean renavamValido(String valor) {
            String n = valor.replaceAll("\\D", "");
            if (n.length() < 9 || n.length() > 11) return false;
            n = "0".repeat(11 - n.length()) + n;
            if (n.matches("(\\d)\\1{10}")) return false;
            int[] pesos = {3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
            int soma = 0;
            for (int i = 0; i < 10; i++) soma += pesos[i] * (n.charAt(i) - '0');
            int dv = (soma * 10) % 11;
            if (dv == 10) dv = 0;
            return dv == n.charAt(10) - '0';
        }
    }
    <?php
    // RENAVAM: 11 dígitos (os antigos, de 9, ganham zeros à esquerda)
    function renavamValido(string $valor): bool {
        $n = preg_replace('/\D/', '', $valor);
        if (strlen($n) < 9 || strlen($n) > 11) return false;
        $n = str_pad($n, 11, '0', STR_PAD_LEFT);
        if (preg_match('/^(\d)\1{10}$/', $n)) return false;
        $pesos = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
        $soma = 0;
        foreach ($pesos as $i => $p) $soma += $p * (int)$n[$i];
        $dv = ($soma * 10) % 11;
        if ($dv === 10) $dv = 0;
        return $dv === (int)$n[10];
    }
    using System.Linq;
    using System.Text.RegularExpressions;
    
    public static class Validador
    {
        // RENAVAM: 11 dígitos (os antigos, de 9, ganham zeros à esquerda)
        public static bool RenavamValido(string valor)
        {
            var n = Regex.Replace(valor, @"\D", "");
            if (n.Length < 9 || n.Length > 11) return false;
            n = n.PadLeft(11, '0');
            if (n.Distinct().Count() == 1) return false;
            int[] pesos = { 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int soma = 0;
            for (int i = 0; i < 10; i++) soma += pesos[i] * (n[i] - '0');
            int dv = (soma * 10) % 11;
            if (dv == 10) dv = 0;
            return dv == n[10] - '0';
        }
    }

    Perguntas frequentes

    RENAVAM tem sempre 11 dígitos?

    O padrão atual sim. Números antigos de 9 dígitos são tratados como se tivessem zeros à esquerda até completar 11.

    Onde encontro o RENAVAM?

    No CRLV (documento do veículo), em geral no campo "Código RENAVAM".

    A validação consulta o Detran?

    Não. Só confere a consistência do dígito verificador, sem enviar nada a servidor algum.

    Veja também

    Precisa de um sistema ou app sob medida?

    A VcInova desenvolve software, aplicativos e integrações para empresas de todo o Brasil.

    Fale com a VcInova