All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.arch.util.br.CpfCnpjUtils Maven / Gradle / Ivy

package com.arch.util.br;

import com.arch.util.CaracterUtils;

import java.util.regex.Pattern;

public final class CpfCnpjUtils {

    private static final int DOIS = 2;
    private static final int TRES = 3;
    private static final int QUATRO = 4;
    private static final int CINCO = 5;
    private static final int SEIS = 6;
    private static final int SETE = 7;
    private static final int OITO = 8;
    private static final int NOVE = 9;
    private static final int DEZ = 10;
    private static final int ONZE = 11;
    private static final int DOZE = 12;
    private static final int TREZE = 13;
    private static final int QUATORZE = 14;
    private static final int QUARENTA_OITO = 48;
    public static final int UM = 1;
    public static final int ZERO = 0;

    private CpfCnpjUtils() {
        //
    }

    public static String formataCpf(String cpf) {
        String value = CaracterUtils.alinharTextoDireita(cpf, ONZE, "0");

        return formataMascara(value, "###.###.###-##");
    }

    public static String formataCnpj(String cnpj) {
        String value = CaracterUtils.alinharTextoDireita(cnpj, QUATORZE, "0");

        return formataMascara(value, "##.###.###/####-##");
    }

    public static String formata(String valor) {
        if (valor.length() <= ONZE) {
            return formataCpf(valor);
        } else {
            return formataCnpj(valor);
        }
    }

    public static boolean valida(String cpfCnpj) {
        String value = tiraFormatacao(cpfCnpj);

        if (value.length() == ONZE) {
            return validaCpf(value);
        } else {
            return validaCnpj(value);
        }
    }

    public static String tiraFormatacao(String aDesformatar) {
        return aDesformatar.replaceAll("[-\\./]", "");
    }

    public static boolean validaCpf(String cpf) {

        String value = cpf.replace(".", "").replace("-", "");

        if (validaTamanhoRepeticao(value)) {
            return false;
        }

        int i;
        int num;
        int peso;
        int sm = ZERO;
        peso = DEZ;
        for (i = ZERO; i < NOVE; i++) {
            // converte o i-esimo caractere do value em um numero:
            // por exemplo, transforma o caractere '0' no inteiro 0
            // (48 eh a posicao de '0' na tabela ASCII)
            num = value.charAt(i) - QUARENTA_OITO;
            sm = sm + (num * peso);
            peso = peso - UM;
        }

        int r = ONZE - (sm % ONZE);
        char dig10;
        if ((r == DEZ) || (r == ONZE)) {
            dig10 = '0';
        } else {
            dig10 = (char) (r + QUARENTA_OITO);
        }
        // converte no respectivo caractere numerico
        // Calculo do 2o. Digito Verificador
        sm = ZERO;
        peso = ONZE;
        for (i = ZERO; i < DEZ; i++) {
            num = value.charAt(i) - QUARENTA_OITO;
            sm = sm + (num * peso);
            peso = peso - UM;
        }
        r = ONZE - (sm % ONZE);

        char dig11;
        if ((r == DEZ) || (r == ONZE)) {
            dig11 = '0';
        } else {
            dig11 = (char) (r + QUARENTA_OITO);
        }
        // Verifica se os digitos calculados conferem com os digitos
        // informados.

        return dig10 == value.charAt(NOVE) && dig11 == value.charAt(DEZ);

    }

    public static String formataCpfCnpj(String numero) {
        if (numero == null) {
            return "";
        }

        StringBuilder cpfCNPJ = new StringBuilder();
        String retorno;
        if (numero.length() <= ONZE) {
            for (int i = ZERO; i < (ONZE - numero.length()); i++) {
                cpfCNPJ.append("0");
            }

            cpfCNPJ.append(numero);

            retorno = cpfCNPJ.substring(ZERO, TRES) + "." + cpfCNPJ.substring(TRES, SEIS) + "." + cpfCNPJ.substring(SEIS, NOVE) + "-" + cpfCNPJ.substring(NOVE, ONZE);
        } else {
            for (int i = ZERO; i < (QUATORZE - numero.length()); i++) {
                cpfCNPJ.append("0");
            }

            cpfCNPJ.append(numero);
            retorno = cpfCNPJ.substring(ZERO, DOIS) + "." + cpfCNPJ.substring(DOIS, CINCO) + "." + cpfCNPJ.substring(CINCO, OITO) + "/" + cpfCNPJ.substring(OITO, DOZE) + "-"
                    + cpfCNPJ.substring(DOZE, QUATORZE);
        }

        return retorno;
    }

    public static String formataCnpjBase(String numero) {
        if (numero == null) {
            return "";
        }

        StringBuilder cpfCNPJ = new StringBuilder();
        String retorno;

        for (int i = ZERO; i < (OITO - numero.length()); i++) {
            cpfCNPJ.append("0");
        }

        cpfCNPJ.append(numero);

        retorno = cpfCNPJ.substring(ZERO, DOIS) + "." + cpfCNPJ.substring(DOIS, CINCO) + "." + cpfCNPJ.substring(CINCO, OITO);

        return retorno;
    }

    private static int parseCharToInt(char c) {
        return Integer.parseInt(Character.toString(c));
    }

    private static String formataMascara(String valor, String mascara) {
        String dado = "";
        // remove caracteres nao numericos
        for (int i = ZERO; i < valor.length(); i++) {
            char c = valor.charAt(i);
            if (Character.isDigit(c)) {
                dado += Character.toString(c);
            }
        }

        int indMascara = mascara.length();
        int indCampo = dado.length();

        for (; indCampo > ZERO && indMascara > ZERO; ) {
            indMascara--;
            if (mascara.charAt(indMascara) == '#') {
                indCampo--;
            }
        }

        String saida = "";
        for (; indMascara < mascara.length(); indMascara++) {
            if (mascara.charAt(indMascara) == '#') {
                saida += dado.charAt(indCampo);
                indCampo++;
            } else {
                saida += mascara.charAt(indMascara);
            }
        }

        return saida;
    }

    private static boolean validaTamanhoRepeticao(String value) {
        for (int i = ZERO; i < DEZ; i++) {
            if (CaracterUtils.replicate(Integer.toString(i), ONZE).equals(value)) {
                return true;
            }
        }

        return value.length() != ONZE;

    }


    public static boolean validaCnpj(String numeroCnpj) {
        String cnpj = numeroCnpj;

        cnpj = cnpj.replaceAll(Pattern.compile("\\s").toString(), "");
        cnpj = cnpj.replaceAll(Pattern.compile("\\D").toString(), "");

        if (cnpj.length() != QUATORZE) {
            return false;
        }

        char[] aCnpj = cnpj.toCharArray();

        int soma = parseCharToInt(aCnpj[ZERO]) * CINCO;
        soma += (parseCharToInt(aCnpj[UM]) * QUATRO);
        soma += (parseCharToInt(aCnpj[DOIS]) * TRES);
        soma += (parseCharToInt(aCnpj[TRES]) * DOIS);
        soma += (parseCharToInt(aCnpj[QUATRO]) * NOVE);
        soma += (parseCharToInt(aCnpj[CINCO]) * OITO);
        soma += (parseCharToInt(aCnpj[SEIS]) * SETE);
        soma += (parseCharToInt(aCnpj[SETE]) * SEIS);
        soma += (parseCharToInt(aCnpj[OITO]) * CINCO);
        soma += (parseCharToInt(aCnpj[NOVE]) * QUATRO);
        soma += (parseCharToInt(aCnpj[DEZ]) * TRES);
        soma += (parseCharToInt(aCnpj[ONZE]) * DOIS);

        int d1 = soma % ONZE;

        d1 = d1 < DOIS ? ZERO : (ONZE - d1);

        soma = ZERO;
        soma += (parseCharToInt(aCnpj[ZERO]) * SEIS);
        soma += (parseCharToInt(aCnpj[UM]) * CINCO);
        soma += (parseCharToInt(aCnpj[DOIS]) * QUATRO);
        soma += (parseCharToInt(aCnpj[TRES]) * TRES);
        soma += (parseCharToInt(aCnpj[QUATRO]) * DOIS);
        soma += (parseCharToInt(aCnpj[CINCO]) * NOVE);
        soma += (parseCharToInt(aCnpj[SEIS]) * OITO);
        soma += (parseCharToInt(aCnpj[SETE]) * SETE);
        soma += (parseCharToInt(aCnpj[OITO]) * SEIS);
        soma += (parseCharToInt(aCnpj[NOVE]) * CINCO);
        soma += (parseCharToInt(aCnpj[DEZ]) * QUATRO);
        soma += (parseCharToInt(aCnpj[ONZE]) * TRES);
        soma += (parseCharToInt(aCnpj[DOZE]) * DOIS);

        int d2 = soma % ONZE;
        d2 = d2 < DOIS ? ZERO : (ONZE - d2);

        return parseCharToInt(aCnpj[DOZE]) == d1 && parseCharToInt(aCnpj[TREZE]) == d2;
    }

    public static boolean isValidAndNotRequired(String cpfCnpj) {
        if (cpfCnpj == null
                || cpfCnpj.isEmpty()) {
            return true;
        }

        return CpfCnpjUtils.valida(cpfCnpj);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy