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')); // trueimport 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")) # Trueimport (
"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