Last active
May 4, 2024 16:12
-
-
Save adrianoluis/5043397d378ae506d87366abb0ab4e30 to your computer and use it in GitHub Desktop.
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Eu também estou fazendo o curso do Prof. Nélio Alves lá na Udemy. Me ajudou e muito. Obrigado pelo código