Ferramentas / Validador de título de eleitor

Validador de título de eleitor

Digite o número do título e veja na hora se o tamanho, a UF e os dois dígitos verificadores conferem.

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

    Como usar

    Digite os 12 dígitos do título, com ou sem espaços. A ferramenta mostra o resultado enquanto você digita e informa se o erro está no tamanho, no código da UF ou em qual dos dois dígitos verificadores.

    Estrutura e cálculo

    O título tem 8 dígitos de inscrição, 2 dígitos de UF de emissão (01 SP, 02 MG, 03 RJ ... 27 TO, 28 para o exterior) e 2 dígitos verificadores. O 1º é calculado com os 8 primeiros dígitos e pesos de 2 a 9; o 2º usa os dígitos da UF e o 1º verificador com pesos 7, 8 e 9. Em ambos o resto da divisão por 11 é o dígito, com resto 10 virando 0. Na prática, em títulos de SP e MG com resto 0, o dígito adotado é 1.

    Esta é a regra amplamente adotada em validadores, mas o Tribunal Superior Eleitoral não publica o algoritmo como especificação aberta. Títulos antigos de SP e MG com 13 dígitos não são tratados. A ferramenta só confere a consistência matemática; ela não consulta o TSE.

    Como implementar em código

    Exemplos prontos para usar no seu projeto.

    // Título de eleitor: 8 dígitos de inscrição + 2 da UF (01 a 28) + 2 DVs
    function dvTitulo(soma, uf) {
      const r = soma % 11;
      if (r === 10) return 0;
      if (r === 0 && (uf === 1 || uf === 2)) return 1;   // exceção de SP e MG
      return r;
    }
    
    function tituloValido(valor) {
      const n = String(valor).replace(/\D/g, '');
      if (n.length !== 12 || n.startsWith('00000000')) return false;
      const d = n.split('').map(Number);
      const uf = d[8] * 10 + d[9];
      if (uf < 1 || uf > 28) return false;
      let soma = 0;
      for (let i = 0; i < 8; i++) soma += d[i] * (i + 2);          // pesos 2..9
      const dv1 = dvTitulo(soma, uf);
      const dv2 = dvTitulo(d[8] * 7 + d[9] * 8 + dv1 * 9, uf);     // pesos 7, 8, 9
      return dv1 === d[10] && dv2 === d[11];
    }
    
    console.log(tituloValido('6908 4709 28 28')); // true
    import re
    
    def _dv_titulo(soma: int, uf: int) -> int:
        r = soma % 11
        if r == 10:
            return 0
        if r == 0 and uf in (1, 2):   # exceção de SP e MG
            return 1
        return r
    
    def titulo_valido(valor: str) -> bool:
        """Título de eleitor: 8 dígitos + 2 da UF (01 a 28) + 2 DVs."""
        n = re.sub(r"\D", "", valor)
        if len(n) != 12 or n.startswith("00000000"):
            return False
        d = [int(c) for c in n]
        uf = d[8] * 10 + d[9]
        if not 1 <= uf <= 28:
            return False
        soma = sum(d[i] * (i + 2) for i in range(8))          # pesos 2..9
        dv1 = _dv_titulo(soma, uf)
        dv2 = _dv_titulo(d[8] * 7 + d[9] * 8 + dv1 * 9, uf)   # pesos 7, 8, 9
        return dv1 == d[10] and dv2 == d[11]
    
    print(titulo_valido("6908 4709 28 28"))  # True
    import (
    	"regexp"
    	"strings"
    )
    
    var naoDigito = regexp.MustCompile(`\D`)
    
    func dvTitulo(soma, uf int) int {
    	r := soma % 11
    	if r == 10 {
    		return 0
    	}
    	if r == 0 && (uf == 1 || uf == 2) { // exceção de SP e MG
    		return 1
    	}
    	return r
    }
    
    // TituloValido valida o título de eleitor (12 dígitos: 8 + UF + 2 DVs).
    func TituloValido(valor string) bool {
    	n := naoDigito.ReplaceAllString(valor, "")
    	if len(n) != 12 || strings.HasPrefix(n, "00000000") {
    		return false
    	}
    	d := make([]int, 12)
    	for i := range d {
    		d[i] = int(n[i] - '0')
    	}
    	uf := d[8]*10 + d[9]
    	if uf < 1 || uf > 28 {
    		return false
    	}
    	soma := 0
    	for i := 0; i < 8; i++ {
    		soma += d[i] * (i + 2) // pesos 2..9
    	}
    	dv1 := dvTitulo(soma, uf)
    	dv2 := dvTitulo(d[8]*7+d[9]*8+dv1*9, uf) // pesos 7, 8, 9
    	return dv1 == d[10] && dv2 == d[11]
    }
    int _dvTitulo(int soma, int uf) {
      final r = soma % 11;
      if (r == 10) return 0;
      if (r == 0 && (uf == 1 || uf == 2)) return 1; // exceção de SP e MG
      return r;
    }
    
    /// Título de eleitor: 8 dígitos + 2 da UF (01 a 28) + 2 DVs.
    bool tituloValido(String valor) {
      final n = valor.replaceAll(RegExp(r'\D'), '');
      if (n.length != 12 || n.startsWith('00000000')) return false;
      final d = n.split('').map(int.parse).toList();
      final uf = d[8] * 10 + d[9];
      if (uf < 1 || uf > 28) return false;
      var soma = 0;
      for (var i = 0; i < 8; i++) {
        soma += d[i] * (i + 2); // pesos 2..9
      }
      final dv1 = _dvTitulo(soma, uf);
      final dv2 = _dvTitulo(d[8] * 7 + d[9] * 8 + dv1 * 9, uf); // pesos 7, 8, 9
      return dv1 == d[10] && dv2 == d[11];
    }
    final class Validador {
        private static int dvTitulo(int soma, int uf) {
            int r = soma % 11;
            if (r == 10) return 0;
            if (r == 0 && (uf == 1 || uf == 2)) return 1;   // exceção de SP e MG
            return r;
        }
    
        /** Título de eleitor: 8 dígitos + 2 da UF (01 a 28) + 2 DVs. */
        static boolean tituloValido(String valor) {
            String n = valor.replaceAll("\\D", "");
            if (n.length() != 12 || n.startsWith("00000000")) return false;
            int[] d = new int[12];
            for (int i = 0; i < 12; i++) d[i] = n.charAt(i) - '0';
            int uf = d[8] * 10 + d[9];
            if (uf < 1 || uf > 28) return false;
            int soma = 0;
            for (int i = 0; i < 8; i++) soma += d[i] * (i + 2);          // pesos 2..9
            int dv1 = dvTitulo(soma, uf);
            int dv2 = dvTitulo(d[8] * 7 + d[9] * 8 + dv1 * 9, uf);       // pesos 7, 8, 9
            return dv1 == d[10] && dv2 == d[11];
        }
    }
    <?php
    function dvTitulo(int $soma, int $uf): int {
        $r = $soma % 11;
        if ($r === 10) return 0;
        if ($r === 0 && ($uf === 1 || $uf === 2)) return 1;   // exceção de SP e MG
        return $r;
    }
    
    // Título de eleitor: 8 dígitos + 2 da UF (01 a 28) + 2 DVs
    function tituloValido(string $valor): bool {
        $n = preg_replace('/\D/', '', $valor);
        if (strlen($n) !== 12 || strpos($n, '00000000') === 0) return false;
        $d = array_map('intval', str_split($n));
        $uf = $d[8] * 10 + $d[9];
        if ($uf < 1 || $uf > 28) return false;
        $soma = 0;
        for ($i = 0; $i < 8; $i++) $soma += $d[$i] * ($i + 2);          // pesos 2..9
        $dv1 = dvTitulo($soma, $uf);
        $dv2 = dvTitulo($d[8] * 7 + $d[9] * 8 + $dv1 * 9, $uf);         // pesos 7, 8, 9
        return $dv1 === $d[10] && $dv2 === $d[11];
    }
    using System.Linq;
    using System.Text.RegularExpressions;
    
    public static class Validador
    {
        static int DvTitulo(int soma, int uf)
        {
            int r = soma % 11;
            if (r == 10) return 0;
            if (r == 0 && (uf == 1 || uf == 2)) return 1;   // exceção de SP e MG
            return r;
        }
    
        // Título de eleitor: 8 dígitos + 2 da UF (01 a 28) + 2 DVs
        public static bool TituloValido(string valor)
        {
            var n = Regex.Replace(valor, @"\D", "");
            if (n.Length != 12 || n.StartsWith("00000000")) return false;
            var d = n.Select(c => c - '0').ToArray();
            int uf = d[8] * 10 + d[9];
            if (uf < 1 || uf > 28) return false;
            int soma = 0;
            for (int i = 0; i < 8; i++) soma += d[i] * (i + 2);          // pesos 2..9
            int dv1 = DvTitulo(soma, uf);
            int dv2 = DvTitulo(d[8] * 7 + d[9] * 8 + dv1 * 9, uf);       // pesos 7, 8, 9
            return dv1 == d[10] && dv2 == d[11];
        }
    }

    Perguntas frequentes

    O que significa o código da UF no título?

    São os dígitos nas posições 9 e 10 e indicam o estado onde o título foi emitido (01 SP, 02 MG, 03 RJ, e assim por diante; 28 é o exterior).

    Passou na validação, então o título é de uma pessoa real?

    Não. A validação só mostra que o número é matematicamente consistente. Para confirmar a situação eleitoral use os serviços oficiais da Justiça Eleitoral.

    Meu título tem 13 dígitos, por quê?

    Alguns títulos antigos de SP e MG têm 9 dígitos de inscrição. Essa variação não é tratada aqui.

    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