Algoritmo de validação do CPF

7 06 2008

O CPF é composto por onze dígitos, onde os dois últimos são os dígitos verificadores, que são criados a partir dos nove primeiros.

O cálculo é efetuado em duas etapas utilizando o número 11 como módulo divisor.

Para exemplificar melhor, iremos calcular os dígitos verificadores de um CPF imaginário, por exemplo, 123.123.123-XX.

Primeiro pega-se os nove primeiros dígitos multiplica pelo decréscimo de 10, depois some os valores obtidos.

Ex:
soma = 1*10 + 2*9 + 3*8 + 1*7 + 2*6 + 3*5 + 1*4 + 2*3 + 3*2;

Agora pegue o resultado da soma e faça a divisão por 11.

Ex:
divisao = soma / 11;

O resultado da divisão será 9 quociente e 3 de resto, faça a subtração de 11 pelo resto da divisão.

Ex:
dv = 11 - 3;

O primeiro digito verificador será 8, agora multiplique 8 por 2.

Ex:
digito = 8*2;

Agora vamos calcular o segundo digito verificador, dessa vez iremos multiplica os nove primeiros dígitos pelo decréscimo
de 11 e soma com o resultado de 8*2.

Ex:
soma= 1*11 + 2*10 + 3*9 + 1*8 + 2*7 + 3*6 + 1*5 + 2*4 + 3*3 +8*2;

Agora pege o resultado da soma e faça a divisão por 11.

Ex:
divisao = soma / 11;

O resultado da divisão será 12 quociente e 4 de resto, faça a subtração de 11 pelo resto da divisão.

Ex:
dv = 11 - 4;

O segundo digito verificador será 7.

O resultado final será = 123.123.123-XX

Veja abaixo exemplo que fiz em php.


Ações

Information

Uma resposta

24 12 2010
Marcos Turisco

Boa noite companheiro, gostei da lógica do seu código, mas a verificação do segundo digito não funciona como demonstrado, tive que fazer algumas alterações para que desse certo, gostaria de deixar demonstrado para que você possa corrigir o seu, ou possívelmente até enxugar ainda mais a minha solução abaixo demonstrada:

public boolean isValidCPF(ArrayList validate) {
boolean isValid = false;
ArrayList digits = new ArrayList();
ArrayList digitos = new ArrayList();
String cpf = “”;
int add = 0, first_inc = 0, second_inc = 0, first_digit = 0, second_digit = 0, consta = 11;

for(Character c : validate) {
cpf += c.toString();
}

for (Character c : validate) {
digitos.add(c.toString());
}

for(String s : digitos) {
digits.add(Integer.parseInt(s));
}

for (int i=digits.size()-1; i>1; i–) {
add += i * (digits.get(first_inc++));
if (first_inc == 9) break;
}
first_digit = consta – add % consta;
add = 0;

for (int i=digits.size(); i>1; i–) {

if (second_inc == 9) {
add += first_digit * 2;
break;
}

add += i * (digits.get(second_inc++));
}
second_digit = consta – add % consta;

String ld = String.valueOf(second_digit);
int a = Integer.parseInt(cpf.substring(10));
String aa = String.valueOf(ld.charAt(ld.length()-1));
int b = Integer.parseInt(aa);

if (digits.get(digits.size()-2) == first_digit && a == b) {
isValid = true;
}
return isValid;
}

Deixe um comentário