Utilizando Módulo 10 para calcular dígito verificador 10


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

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

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

Related Posts Plugin for WordPress, Blogger...
  • Muito obrigado pela ajuda meu amigo!!!!!!!
    QUALQUER COISA ESTAMOS AI!!!!

  • Humberto

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

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

    Essa linha me deu medo desse teu código…

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

    • Marcus Siqueira

      Fabrício obrigado pela contribuição.

    • XXande

      sum += res > 9 ? (res - 10) + 1 : res;

      //otimizando:
      sum += res > 9 ? (res - 9) : res;

    • Felipe

      O código acima está percorrendo a string da esquerda pra direita. Mas o módulo 10 percorre da direita para a esquerda. Além disso, se o sum for 10, a função retornará 10 [10 – (10 % 10)].

      Com essas questões corrigidas, o código fica assim:


      public static int Mod10(this string str)
      {
      int mult = 2;
      int sum = 0;

      for (int i = (str.Length - 1); i >= 0; i--)
      {
      char c = str[i];

      int res = Convert.ToInt32(c.ToString()) * mult;
      sum += res > 9 ? (res - 10) + 1 : res;
      mult = mult == 2 ? 1 : 2;
      }

      return sum == 10 ? 0 : 10 - (sum % 10);
      }

      Deve haver formas mais “elegantes” de se resolver o problema, mas por hora, isso resolve! hehe

  • Felipe

    Olha só que feio que eu fiz. Corrigi errado…
    Agora está certinho:


    public static int Mod10(this string str)
    {
    int mult = 2;
    int sum = 0;

    for (int i = (str.Length - 1); i >= 0; i--)
    {
    char c = str[i];

    int res = Convert.ToInt32(c.ToString()) * mult;
    sum += res > 9 ? (res - 10) + 1 : res;
    mult = mult == 2 ? 1 : 2;
    }

    int diferenca = 10 - (sum % 10);
    return diferenca % 10;
    }

  • Márcio,

    A questão do módulo dez, deve levar em conta o “noves fora”. Quando o resultado da multiplicação por dois for maior que nove, devemos subtrair nove deste produto. Uma forma mais simplificada que já vi é somar os dois algarismos do produto. Exemplo: 5 X 2 = 10 => 1 + 0; ou 10 – 9 = 1.

    At,
    Ricardo.

  • Edson Trigo

    Caros senhores. Não entendo de programas mas gostaria de levantar uma questão. Já tive problemas com dígito verificador usando o módulo 10. Exemplo: 09900109011-9 e 00990109011-9. Os dois números que são diferentes deram o mesmo resultado para o dígito verificador. No caso específico, o primeiro implicava num valor de R$ 109,90 e o outro R$ 100,99.
    Alguém poderia me explicar porque isso ocorre ?