Validador de Inscrição Estadual de SP
Digite a IE de São Paulo e veja na hora se o tamanho e os dois dígitos verificadores conferem.
Atenção: cada UF tem regra própria de inscrição estadual. Esta ferramenta valida somente São Paulo.
Processamento local: nada do que você digita sai do seu navegador.
Como usar
Digite a inscrição estadual de SP com 12 dígitos, com ou sem pontos. A resposta aparece enquanto você digita e informa qual dígito verificador está errado.
Atenção: cada UF tem sua regra
A inscrição estadual não segue um padrão nacional: cada estado define tamanho e cálculo próprios. Esta ferramenta valida somente a IE de São Paulo (contribuinte industrial e comercial, 12 dígitos). Para outros estados, o resultado aqui não vale. A IE de produtor rural de SP (começa com P) também não é tratada.
Como o cálculo funciona
Formato NNNNNNNN D NN D. O 1º dígito (9ª posição) é a soma dos 8 primeiros dígitos com pesos 1, 3, 4, 5, 6, 7, 8, 10, módulo 11, mantendo só o último algarismo do resto. O 2º (12ª posição) usa os 11 primeiros dígitos com pesos 3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2 e a mesma redução. Isso confere a consistência do número; não consulta a Sefaz nem confirma a situação cadastral.
Como implementar em código
Exemplos prontos para usar no seu projeto.
// Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D
function ieSpValida(valor) {
const n = String(valor).replace(/\D/g, '');
if (n.length !== 12) return false;
const d = n.split('').map(Number);
const p1 = [1, 3, 4, 5, 6, 7, 8, 10];
const p2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2];
const dv1 = (p1.reduce((s, p, i) => s + p * d[i], 0) % 11) % 10; // 9ª posição
const base = [...d.slice(0, 8), dv1, d[9], d[10]];
const dv2 = (p2.reduce((s, p, i) => s + p * base[i], 0) % 11) % 10; // 12ª posição
return dv1 === d[8] && dv2 === d[11];
}
console.log(ieSpValida('110.042.490.114')); // trueimport re
def ie_sp_valida(valor: str) -> bool:
"""Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D."""
n = re.sub(r"\D", "", valor)
if len(n) != 12:
return False
d = [int(c) for c in n]
p1 = [1, 3, 4, 5, 6, 7, 8, 10]
p2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2]
dv1 = sum(p * x for p, x in zip(p1, d)) % 11 % 10 # 9ª posição
base = d[:8] + [dv1, d[9], d[10]]
dv2 = sum(p * x for p, x in zip(p2, base)) % 11 % 10 # 12ª posição
return dv1 == d[8] and dv2 == d[11]
print(ie_sp_valida("110.042.490.114")) # Trueimport "regexp"
var naoDigito = regexp.MustCompile(`\D`)
// IeSpValida valida a Inscrição Estadual de SP (12 dígitos, 2 DVs).
func IeSpValida(valor string) bool {
n := naoDigito.ReplaceAllString(valor, "")
if len(n) != 12 {
return false
}
d := make([]int, 12)
for i := range d {
d[i] = int(n[i] - '0')
}
p1 := []int{1, 3, 4, 5, 6, 7, 8, 10}
p2 := []int{3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2}
s := 0
for i, p := range p1 {
s += p * d[i]
}
dv1 := s % 11 % 10 // 9ª posição
base := append(append([]int{}, d[:8]...), dv1, d[9], d[10])
s = 0
for i, p := range p2 {
s += p * base[i]
}
dv2 := s % 11 % 10 // 12ª posição
return dv1 == d[8] && dv2 == d[11]
}/// Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D.
bool ieSpValida(String valor) {
final n = valor.replaceAll(RegExp(r'\D'), '');
if (n.length != 12) return false;
final d = n.split('').map(int.parse).toList();
const p1 = [1, 3, 4, 5, 6, 7, 8, 10];
const p2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2];
var s = 0;
for (var i = 0; i < 8; i++) {
s += p1[i] * d[i];
}
final dv1 = s % 11 % 10; // 9ª posição
final base = [...d.sublist(0, 8), dv1, d[9], d[10]];
s = 0;
for (var i = 0; i < 11; i++) {
s += p2[i] * base[i];
}
final dv2 = s % 11 % 10; // 12ª posição
return dv1 == d[8] && dv2 == d[11];
}final class Validador {
/** Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D. */
static boolean ieSpValida(String valor) {
String n = valor.replaceAll("\\D", "");
if (n.length() != 12) return false;
int[] d = new int[12];
for (int i = 0; i < 12; i++) d[i] = n.charAt(i) - '0';
int[] p1 = {1, 3, 4, 5, 6, 7, 8, 10};
int[] p2 = {3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2};
int s = 0;
for (int i = 0; i < 8; i++) s += p1[i] * d[i];
int dv1 = s % 11 % 10; // 9ª posição
int[] base = {d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], dv1, d[9], d[10]};
s = 0;
for (int i = 0; i < 11; i++) s += p2[i] * base[i];
int dv2 = s % 11 % 10; // 12ª posição
return dv1 == d[8] && dv2 == d[11];
}
}<?php
// Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D
function ieSpValida(string $valor): bool {
$n = preg_replace('/\D/', '', $valor);
if (strlen($n) !== 12) return false;
$d = array_map('intval', str_split($n));
$p1 = [1, 3, 4, 5, 6, 7, 8, 10];
$p2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2];
$s = 0;
foreach ($p1 as $i => $p) $s += $p * $d[$i];
$dv1 = $s % 11 % 10; // 9ª posição
$base = array_merge(array_slice($d, 0, 8), [$dv1, $d[9], $d[10]]);
$s = 0;
foreach ($p2 as $i => $p) $s += $p * $base[$i];
$dv2 = $s % 11 % 10; // 12ª posição
return $dv1 === $d[8] && $dv2 === $d[11];
}using System.Linq;
using System.Text.RegularExpressions;
public static class Validador
{
// Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D
public static bool IeSpValida(string valor)
{
var n = Regex.Replace(valor, @"\D", "");
if (n.Length != 12) return false;
var d = n.Select(c => c - '0').ToArray();
int[] p1 = { 1, 3, 4, 5, 6, 7, 8, 10 };
int[] p2 = { 3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
int s = 0;
for (int i = 0; i < 8; i++) s += p1[i] * d[i];
int dv1 = s % 11 % 10; // 9ª posição
var b = d.Take(8).Concat(new[] { dv1, d[9], d[10] }).ToArray();
s = 0;
for (int i = 0; i < 11; i++) s += p2[i] * b[i];
int dv2 = s % 11 % 10; // 12ª posição
return dv1 == d[8] && dv2 == d[11];
}
}Perguntas frequentes
A regra serve para outros estados?
Não. Cada UF tem tamanho e algoritmo próprios para a inscrição estadual. Esta ferramenta valida apenas São Paulo.
A validação consulta a Sefaz?
Não. Só confere os dígitos verificadores. A situação cadastral só é obtida em consulta oficial.
E a IE de produtor rural?
A IE de produtor rural de SP (começa com a letra P) tem formato diferente e não é tratada por esta ferramenta.
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