Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Utility class to validate CPF and CNPJ document types. For CPF use isValidSsn and for CNPJ use isValidTfn. Added to repo https://github.com/adrianoluis/misc-tools
public class DocumentUtil {
// CPF
private static final int[] WEIGHT_SSN = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2};
// CNPJ
private static final int[] WEIGHT_TFN = {6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
private static int sum(int[] weight, char[] numbers, int length) {
if (length <= 0) return 0;
final int nIdx = length - 1;
final int wIdx = weight.length > numbers.length ? length : nIdx;
return (sum(weight, numbers, nIdx) + Character.getNumericValue(numbers[nIdx]) * weight[wIdx]);
}
private static int calculate(final String document, final int[] weight) {
final char[] numbers = document.toCharArray();
int sum = sum(weight, numbers, numbers.length);
sum = 11 - (sum % 11);
return sum > 9 ? 0 : sum;
}
private static boolean check(String tfn, int length, int[] weight) {
final String number = tfn.substring(0, length);
final int digit1 = calculate(number, weight);
final int digit2 = calculate(number + digit1, weight);
return tfn.equals(number + digit1 + digit2);
}
/**
* Valida CPF
*/
public static boolean isValidSsn(String ssn) {
if (ssn == null || !ssn.matches("\\d{11}") || ssn.matches(ssn.charAt(0) + "{11}")) return false;
return check(ssn, 9, WEIGHT_SSN);
}
/**
* Valida CNPJ
*/
public static boolean isValidTfn(String tfn) {
if (tfn == null || !tfn.matches("\\d{14}")) return false;
return check(tfn, 12, WEIGHT_TFN);
}
}
@newtonneto
Copy link

newtonneto commented Jan 21, 2022

Muito obrigado

@charllysonsouza
Copy link

charllysonsouza commented Jan 22, 2022

Obrigado! Estou vindo pelo curso do Nélio da Udemy. Valeu!

@lissa-sonoda
Copy link

lissa-sonoda commented Mar 2, 2022

Muito obrigada, Luis!! Ajudou demais!!

@marland-tales
Copy link

marland-tales commented Apr 5, 2022

Tks bro!

@MarcioGomes78
Copy link

MarcioGomes78 commented Jul 3, 2022

Obrigado em ajudar com seu conhecimento um abraço.

@yujiyamamoto64
Copy link

yujiyamamoto64 commented Jul 25, 2022

Passando pra agradecer tbm!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment