Estava precisando de um validador de cpf e desenvolvi este.
Resolvi postar, pois pode ajudar alguem e enriquece o forum…
Opiniões e críticas serão bem vindas…
Testei e é rápido…
// cpf = 123.654.987-98
public static boolean validateCPF(String cpf) {
StringBuffer string = new StringBuffer(cpf);
string = string.deleteCharAt(3).deleteCharAt(6).deleteCharAt(9);
// Calcula o Prefixo
StringBuffer prefixo = new StringBuffer(string.subSequence(0, 9));
// Calcula o Sufixo
StringBuffer sufixo = new StringBuffer(string.subSequence(9, 11));
// Utilizado pra posterior comparação com o sufixo
StringBuffer retorno = new StringBuffer();
//Valor utilizado para o cálculo
long valor = new Long(prefixo.toString()).longValue();
//Valor utilizado apenas pra cálculo
int incremento = 10;
//Flag utilizada pra comparar se os números são iguais
boolean flag = true;
//Calcula a soma pra calcular o primeiro dígito
int totalPrimeiroDigito = 0;
//Calcula a soma pra calcular o segundo dígito
int totalSegundoDigito = 0;
for (int i = 2; i < 11; i++) {
//Dígito utilizado pra realizar o cálculo
long valorVerificado = valor % incremento;
//Atualiza o valor
valor = valor / incremento;
//Calcula o próximo numero a ser verificado
long proximo = valor % incremento;
//Se forem diferentes a flag é atualizada
if (valorVerificado != proximo) {
flag = false;
}
//Atualizam os totais do primeiro e segundo dígito
totalPrimeiroDigito += (i) * valorVerificado;
totalSegundoDigito += valorVerificado * (i + 1);
}
//Primeiro dígito
int digitoPrimiero = 11 - (totalPrimeiroDigito % 11);
if (digitoPrimiero >= 10) {
digitoPrimiero = 0;
}
//Atualiza o total pra calcular o segundo dígito
totalSegundoDigito += digitoPrimiero * 2;
//Segundo dígito
int digitoSegundo = 11 - (totalSegundoDigito % 11);
if (digitoSegundo >= 10) {
digitoSegundo = 0;
}
//Concatena os dois valores pra posterior comparação com o sufixo
retorno.append(digitoPrimiero).append(digitoSegundo);
//Verifica se os valores são igauis e se os dígitos são diferentes
if (retorno.toString().equals(sufixo.toString()) && (!flag)) {
return true;
}
return false;
}