Governo do Estado de Pernambuco - Roteiro de Crítica da Inscrição Estadual
O número de inscrição estadual no Cadastro de Contribuintes do Estado de Pernambuco - CACEPE possui 14 algarismos (dígitos), sendo 13 principais e 1 verificador. O cálculo do dígito verificador envolve o uso de "pesos" e da função "módulo" com parâmetro "11", conforme pode ser visto no exemplo abaixo:
Procedimentos de Cálculo (ex. para 18.1.001.0000004-9)
1. Multiplique cada algarismo principal pelo seu respectivo peso:
1 8 1 0 0 1 0 0 0 0 0 0 4 (algarismos)
x x x x x x x x x x x x x .
5 4 3 2 1 9 8 7 6 5 4 3 2 (pesos)
= = = = = = = = = = = = = .
5 32 3 0 0 9 0 0 0 0 0 0 8 (produtos)
2. Some os produtos obtidos para encontrar o total:
5 + 32 + 3 + 0 + 0 + 9 + 0 + 0 + 0 + 0 + 0 + 0 + 8 = 57
(total dos produtos)
3. Divida esse total pela constante "11" para obter o resto:
4. Subtraia esse resto da constante "11" para encontrar o dígito verificador:11 - 2 = 9
Quando essa diferença for maior que "9", subtraia "10" unidades para obter o valor do dígito verificador, uma vez que o mesmo deve ser sempre representado por apenas um algarismo.
Rotina de Verificação (exemplo em linguagem Pascal)
O parâmetro "ie" deve ser do tipo String com 14 posições.

Function teste_dv_cacepe (ie: String): Boolean;
     Var a, b, c, d, e, f, g, h, i, j, k, l, m, n, total, dig: Integer;
     Begin
         a := StrToInt(Copy(ie,14,1));
         b := StrToInt(Copy(ie,13,1)) * 2;
         c := StrToInt(Copy(ie,12,1)) * 3;
         d := StrToInt(Copy(ie,11,1)) * 4;
         e := StrToInt(Copy(ie,10,1)) * 5;
         f := StrToInt(Copy(ie,9,1)) * 6;
         g := StrToInt(Copy(ie,8,1)) * 7;
         h := StrToInt(Copy(ie,7,1)) * 8;
        

i := StrToInt(Copy(ie,6,1)) * 9;
         j := StrToInt(Copy(ie,5,1)) * 1;
         k := StrToInt(Copy(ie,4,1)) * 2;
         l := StrToInt(Copy(ie,3,1)) * 3;
         m := StrToInt(Copy(ie,2,1)) * 4;
         n := StrToInt(Copy(ie,1,1)) * 5;
         total := b + c + d + e + f + g + h + i + j + k + l + m + n;
         dig := 11 - (total Mod 11);
         If dig > 9 Then
              dig := dig - 10;
         If dig <> a Then
            teste_dv_cacepe := False
         Else
            teste_dv_cacepe := True;
    End;
Fechar