Utilizando Módulo 10 para calcular dígito verificador

Dígito verificador ou algarismo de controle é um mecanismo de autenticação utilizado para verificar a validade e a autenticidade de um valor numérico, evitando dessa forma fraudes ou erros de transmissão ou digitação.

É usado normalmente em representações numéricas que exijam integridade, como por exemplo CPF, CNPJ, RG.

O método de cálculo desses dígitos varia conforme o caso, porém muitos deles se baseiam em duas rotinas tradicionais: Módulo 11 e Módulo 10.

O cálculo do Módulo 10 é feito da seguinte maneira:

Cada dígito do número, começando da direita para a esquerda (menos significativo para o mais significativo) é multiplicado, na ordem, por 2, depois 1, depois 2, depois 1 e assim sucessivamente.

Número exemplo: 261533-4

  +---+---+---+---+---+---+   +---+
  | 2 | 6 | 1 | 5 | 3 | 3 | - | 4 |
  +---+---+---+---+---+---+   +---+
    |   |   |   |   |   |
   x1  x2  x1  x2  x1  x2
    |   |   |   |   |   |
   =2 =12  =1 =10  =3  =6
    +---+---+---+---+---+-> = (16 / 10) = 1, resto 6 => DV = (10 - 6) = 4

A função abaixo traduz este esquema na linguagem CSharp e poderá ser utilizada em seus projetos .net.

private string modulo10(string str)
{
    int digito=0;
    int flag=2;
    str=str.Substring(0,str.Length - 1);
    for (int i = str.Length-1; i >= 0; i--)
    {
        int valor = Convert.ToInt32(str[i].ToString()) * flag;
        int soma = 0;
        if (valor.ToString().Length > 1)
        {
            string svalor = valor.ToString();
            for (int j = 0; j < svalor.Length; j++)
            {
                soma += Convert.ToInt32(svalor[j].ToString());
            }
        }
        else
        {
            soma = valor;
        }
        digito += soma;
        flag = (flag == 2) ? 1 : 2;
    }
    digito = digito % 10;
    digito = 10 - digito;
    if (digito == 10)
    {
        digito = 0;
    }
    return digito.ToString();

}

Obs.: Todo o texto didático deste post foi extraído da Wikipédia obedecendo a licença GNU da mesma.

Artigos relacionados

Total de visitas: 3439.
Esta entrada foi publicada em CSharp e marcada com a tag , , , , , . Adicione o link permanente aos seus favoritos.

5 respostas a Utilizando Módulo 10 para calcular dígito verificador

  1. Muito obrigado pela ajuda meu amigo!!!!!!!
    QUALQUER COISA ESTAMOS AI!!!!

  2. Humberto disse:

    Para CPF são 10 e para CNPJ são 12.

  3. Daniel Zhe disse:

    str=str.Substring(0,str.Length – 1);

    Essa linha me deu medo desse teu código…

  4. O código abaixo está otimizado, para quem quiser usar com menos recursos computacionais ai está:

    public static int Mod10(this string str)
    {
       int i = 2;
       int sum = 0;
       foreach (char c in str.ToCharArray())
       {
          int res = Convert.ToInt32(c.ToString()) * i;
          sum += res > 9 ? (res - 10) + 1 : res;
          i = i == 2 ? 1 : 2;
       }
       return 10 - (sum % 10);
    }
    

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>