Estou buscando CNPJ’s em uma base de dados para poder validar cada uma delas, e salvar em log as inválidas e as válidas.
Até ai tudo bem. Eu só estou com um problinha.
Existem alguns CNPJ’s que tem Letras no meio dos números.
Gostaria de saber como faço para ler caracter por caracter, e verificar se tem alguma letra.
Porque ai se eu achar alguma letra, já gravo em log inválido.
Classe CNPJ, possui o metodo isCNPJ que verifica se o cnpj eh valido ou nao…
Voce pode informar qualquer porcaria pra funcao isCNPJ, pode mandar o cnpj com formatacao, sem formatacao, qualquer coisa mesmo, ate uma string que nao tem nada a ver, e ele vai retornar true apenas se o cnpj for valido.
[]s
Kemper
public abstract class CNPJ {
/**
*
*/
private static final long serialVersionUID = 1L;
public static boolean isCNPJ(String str_cnpj) {
int soma = 0, dig;
if (str_cnpj == null) {
return false;
}
str_cnpj = Formatador.getNumeros(str_cnpj);
str_cnpj = Formatador.formata(str_cnpj, "##############");
if (str_cnpj.length() != 14) {
return false;
}
String cnpj_calc = str_cnpj.substring(0, 12);
char[] chr_cnpj = str_cnpj.toCharArray();
/* Primeira parte */
for (int i = 0; i < 4; i++) {
if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
soma += (chr_cnpj[i] - 48) * (6 - (i + 1));
}
}
for (int i = 0; i < 8; i++) {
if (chr_cnpj[i + 4] - 48 >= 0 && chr_cnpj[i + 4] - 48 <= 9) {
soma += (chr_cnpj[i + 4] - 48) * (10 - (i + 1));
}
}
dig = 11 - (soma % 11);
cnpj_calc += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);
/* Segunda parte */
soma = 0;
for (int i = 0; i < 5; i++) {
if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
soma += (chr_cnpj[i] - 48) * (7 - (i + 1));
}
}
for (int i = 0; i < 8; i++) {
if (chr_cnpj[i + 5] - 48 >= 0 && chr_cnpj[i + 5] - 48 <= 9) {
soma += (chr_cnpj[i + 5] - 48) * (10 - (i + 1));
}
}
dig = 11 - (soma % 11);
cnpj_calc += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);
return str_cnpj.equals(cnpj_calc);
}
}
Classe Formatador possui metodos estaticos utilizados pela classe acima:
public class Formatador {
public static String getNumeros(String valor) {
String dado = "";
// remove caracteres nao numericos
for (int i = 0; i < valor.length(); i++) {
char c = valor.charAt(i);
if (Character.isDigit(c)) {
dado += c;
}
}
return dado;
}
public static String formata(String valor, String mascara) {
String dado = getNumeros(valor);
int indMascara = mascara.length();
int indCampo = dado.length();
boolean somenteNumeros = true;
for (int i = 0; i < mascara.length(); i++) {
if (mascara.charAt(i) != '#') {
somenteNumeros = false;
}
}
if (somenteNumeros) {
for (; indCampo > 0 && indMascara > 0;) {
if (mascara.charAt(--indMascara) == '#') {
indCampo--;
}
}
} else {
for (; indCampo > 0 || indMascara > 0;) {
if (mascara.charAt(--indMascara) == '#') {
indCampo--;
}
}
}
String saida = "";
for (; indMascara < mascara.length(); indMascara++) {
saida += ((mascara.charAt(indMascara) == '#') ? dado.charAt(indCampo++) : mascara.charAt(indMascara));
}
return saida;
}
}
Se quiser pode ate mesmo colocar estas funcoes estaticas dentro da propia classse CNPJ, eu uso separado pq tenho outras classes que utilizam as mesmas funcoes.