Pessoar…
Fiz um gerador/validador de CPF/CNPJ em Java 5. Como é uma ferramenta útil estou disponibilizando aqui para geração de dados de teste e pra quem quiser estudar os algoritmos…
Está em anexo na forma de jar auto-executável e contém o código-fonte.
Colocarei o código-fonte também abaixo pra quem quiser ver.
Já avisando que por se tratar de algo simples coloquei tudo em uma classe, com inner classes, e não fiquei me preocupando com otimização, refatoração e reutilização… é só uma coisa simples e rápida, que funciona direitinho (até onde eu testei)…
[code]import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar.Separator;
import javax.swing.text.JTextComponent;
public class Janela extends JFrame {
private static final long serialVersionUID = 1L;
private final Pattern NAO_NUMEROS = Pattern.compile("[^0-9]*");
private final Dimension TAMANHO_CAMPO = new Dimension(150, 20);
private final Dimension TAMANHO_BOTAO = new Dimension(80, 20);
private final String TEXTO_SORTEAR = "Sortear";
private final String TEXTO_GERAR = "Gerar";
private final String TEXTO_VALIDAR = "Validar";
private final String TEXTO_CPF_INVALIDO = "O CPF fornecido é inválido";
private final String TEXTO_CPF_VALIDO = "O CPF fornecido é válido";
private final String TEXTO_CNPJ_INVALIDO = "O CNPJ fornecido é inválido";
private final String TEXTO_CNPJ_VALIDO = "O CNPJ fornecido é válido";
private JTextField campoCPF; // dígitos iniciais CPF
private JButton botaoGerarCampoCPF; // gera dígitos iniciais CPF
private JTextField campoVerificadorCPF; // dígitos verificadores CPF
private JButton botaoGerarCampoVerificadorCPF; // gera dígitos verificadores CPF
private JTextField campoCpfGerado; // Campo com o CPF completo montado
private JButton botaoValidarCPF; // gera dígitos verificadores CPF
private JTextField campoCNPJ; // dígitos iniciais CNPJ
private JButton botaoGerarCampoCNPJ; // gera dígitos iniciais CNPJ
private JTextField campoVerificadorCNPJ; // dígitos verificadores CNPJ
private JButton botaoGerarCampoVerificadorCNPJ; // gera dígitos verificadores CNPJ
private JTextField campoCnpjGerado; // Campo com o CNPJ completo montado
private JButton botaoValidarCNPJ; // gera dígitos verificadores CNPJ
public Janela() {
super("Gera CPF CNPJ");
montaJanela();
}
private void montaJanela() {
FlowLayout layoutHoriz = new FlowLayout();
layoutHoriz.setAlignment(FlowLayout.LEFT);
JPanel painelCpf = new JPanel();
painelCpf.setLayout(new BorderLayout());
JPanel painel01 = new JPanel();
painel01.setLayout(layoutHoriz);
campoCPF = new JTextField();
campoCPF.setPreferredSize(TAMANHO_CAMPO);
campoCPF.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent evt) {
Janela.this.filtraNumeros(campoCPF, 9);
}
public void keyReleased(KeyEvent evt) {
Janela.this.filtraNumeros(campoCPF, 9);
}
public void keyTyped(KeyEvent evt) {
Janela.this.filtraNumeros(campoCPF, 9);
}
});
botaoGerarCampoCPF = new JButton(TEXTO_SORTEAR);
botaoGerarCampoCPF.setPreferredSize(TAMANHO_BOTAO);
botaoGerarCampoCPF.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent evt) {
Janela.this.geraDigitosCPF();
}
});
painel01.add(botaoGerarCampoCPF);
painel01.add(campoCPF);
painel01.add(new JLabel("9 dígitos CPF"));
painelCpf.add(painel01, BorderLayout.NORTH);
JPanel painel02 = new JPanel();
painel02.setLayout(layoutHoriz);
campoVerificadorCPF = new JTextField();
campoVerificadorCPF.setPreferredSize(TAMANHO_CAMPO);
campoVerificadorCPF.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent evt) {
Janela.this.filtraNumeros(campoVerificadorCPF, 2);
}
public void keyReleased(KeyEvent evt) {
Janela.this.filtraNumeros(campoVerificadorCPF, 2);
}
public void keyTyped(KeyEvent evt) {
Janela.this.filtraNumeros(campoVerificadorCPF, 2);
}
});
botaoGerarCampoVerificadorCPF = new JButton(TEXTO_GERAR);
botaoGerarCampoVerificadorCPF.setPreferredSize(TAMANHO_BOTAO);
botaoGerarCampoVerificadorCPF.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent evt) {
Janela.this.geraDvCPF();
}
});
painel02.add(botaoGerarCampoVerificadorCPF);
painel02.add(campoVerificadorCPF);
painel02.add(new JLabel("2 dígitos DV CPF"));
painelCpf.add(painel02, BorderLayout.CENTER);
JPanel painel03 = new JPanel();
painel03.setLayout(layoutHoriz);
campoCpfGerado = new JTextField();
campoCpfGerado.setPreferredSize(TAMANHO_CAMPO);
campoCpfGerado.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent evt) {
Janela.this.filtraNumeros(campoCpfGerado, 11);
}
public void keyReleased(KeyEvent evt) {
Janela.this.filtraNumeros(campoCpfGerado, 11);
}
public void keyTyped(KeyEvent evt) {
Janela.this.filtraNumeros(campoCpfGerado, 11);
}
});
botaoValidarCPF = new JButton(TEXTO_VALIDAR);
botaoValidarCPF.setPreferredSize(TAMANHO_BOTAO);
botaoValidarCPF.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent evt) {
Janela.this.validaCPF();
}
});
painel03.add(botaoValidarCPF);
painel03.add(campoCpfGerado);
painel03.add(new JLabel("CPF gerado"));
painelCpf.add(painel03, BorderLayout.SOUTH);
this.add(painelCpf, BorderLayout.NORTH);
Separator separador = new Separator();
separador.setBorder(BorderFactory.createRaisedBevelBorder());
this.add(separador, BorderLayout.CENTER);
JPanel painelCnpj = new JPanel();
painelCnpj.setLayout(new BorderLayout());
JPanel painel04 = new JPanel();
painel04.setLayout(layoutHoriz);
botaoGerarCampoCNPJ = new JButton(TEXTO_SORTEAR);
botaoGerarCampoCNPJ.setPreferredSize(TAMANHO_BOTAO);
botaoGerarCampoCNPJ.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent evt) {
Janela.this.geraDigitosCNPJ();
}
});
painel04.add(botaoGerarCampoCNPJ);
campoCNPJ = new JTextField();
campoCNPJ.setPreferredSize(TAMANHO_CAMPO);
campoCNPJ.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent evt) {
Janela.this.filtraNumeros(campoCNPJ, 12);
}
public void keyReleased(KeyEvent evt) {
Janela.this.filtraNumeros(campoCNPJ, 12);
}
public void keyTyped(KeyEvent evt) {
Janela.this.filtraNumeros(campoCNPJ, 12);
}
});
painel04.add(campoCNPJ);
painel04.add(new JLabel("12 dígitos CNPJ"));
painelCnpj.add(painel04, BorderLayout.NORTH);
JPanel painel05 = new JPanel();
painel05.setLayout(layoutHoriz);
botaoGerarCampoVerificadorCNPJ = new JButton(TEXTO_GERAR);
botaoGerarCampoVerificadorCNPJ.setPreferredSize(TAMANHO_BOTAO);
botaoGerarCampoVerificadorCNPJ.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent evt) {
Janela.this.geraDvCNPJ();
}
});
painel05.add(botaoGerarCampoVerificadorCNPJ);
campoVerificadorCNPJ = new JTextField();
campoVerificadorCNPJ.setPreferredSize(TAMANHO_CAMPO);
campoVerificadorCNPJ.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent evt) {
Janela.this.filtraNumeros(campoVerificadorCNPJ, 2);
}
public void keyReleased(KeyEvent evt) {
Janela.this.filtraNumeros(campoVerificadorCNPJ, 2);
}
public void keyTyped(KeyEvent evt) {
Janela.this.filtraNumeros(campoVerificadorCNPJ, 2);
}
});
painel05.add(campoVerificadorCNPJ);
painel05.add(new JLabel("2 dígitos DV CNPJ"));
painelCnpj.add(painel05, BorderLayout.CENTER);
JPanel painel06 = new JPanel();
painel06.setLayout(layoutHoriz);
botaoValidarCNPJ = new JButton(TEXTO_VALIDAR);
botaoValidarCNPJ.setPreferredSize(TAMANHO_BOTAO);
botaoValidarCNPJ.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent evt) {
Janela.this.validaCNPJ();
}
});
painel06.add(botaoValidarCNPJ);
campoCnpjGerado = new JTextField();
campoCnpjGerado.setPreferredSize(TAMANHO_CAMPO);
campoCnpjGerado.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent evt) {
Janela.this.filtraNumeros(campoCnpjGerado, 14);
}
public void keyReleased(KeyEvent evt) {
Janela.this.filtraNumeros(campoCnpjGerado, 14);
}
public void keyTyped(KeyEvent evt) {
Janela.this.filtraNumeros(campoCnpjGerado, 14);
}
});
painel06.add(campoCnpjGerado);
painel06.add(new JLabel("CNPJ gerado"));
painelCnpj.add(painel06, BorderLayout.SOUTH);
this.add(painelCnpj, BorderLayout.SOUTH);
this.pack();
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)((screenSize.getWidth()-this.getWidth())/2), (int)((screenSize.getHeight()-this.getHeight())/2));
this.setVisible(true);
}
private void geraDigitosCPF() {
new Thread(new Runnable(){
public void run() {
JTextComponent campo = Janela.this.campoCPF;
Janela.this.desabilitaCamposCPF();
Janela.this.limpaCamposCPF();
while(true){
if(campo.getText().length()==9)break;
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
campo.setText(campo.getText()+(int)Math.floor(Math.random()*10));
}
Janela.this.geraDvCPF();
Janela.this.habilitaCamposCPF();
}
}).start();
}
private void geraDvCPF() {
List<Integer> digitosCPF = obtemListaDigitos(campoCPF);
int soma = 0;
int fator = 10;
for(int digito : digitosCPF){
soma += (fator--) * digito;
}
int resto = soma%11;
digitosCPF.add(resto<2?0:11-resto);
soma = 0;
fator = 11;
for(int digito : digitosCPF){
soma += (fator--) * digito;
}
resto = soma%11;
digitosCPF.add(resto<2?0:11-resto);
StringBuilder cpfCompleto = new StringBuilder();
for(int digito : digitosCPF){
cpfCompleto.append(digito);
}
campoVerificadorCPF.setText(cpfCompleto.substring(cpfCompleto.length()-2, cpfCompleto.length()));
campoCpfGerado.setText(cpfCompleto.toString());
}
private void validaCPF() {
List<Integer> digitosCPF = obtemListaDigitos(campoCpfGerado);
if(digitosCPF.size()<11){
JOptionPane.showMessageDialog(this, TEXTO_CPF_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
return;
}
int[] dvCPF = new int[]{digitosCPF.remove(digitosCPF.size()-2), digitosCPF.remove(digitosCPF.size()-1)};
int soma = 0;
int fator = 10;
for(int digito : digitosCPF){
soma += (fator--) * digito;
}
int resto = soma%11;
int dv = resto<2?0:11-resto;
if(dv!=dvCPF[0]){
JOptionPane.showMessageDialog(this, TEXTO_CPF_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
return;
}
digitosCPF.add(dv);
soma = 0;
fator = 11;
for(int digito : digitosCPF){
soma += (fator--) * digito;
}
resto = soma%11;
dv = resto<2?0:11-resto;
if(dv!=dvCPF[1]){
JOptionPane.showMessageDialog(this, TEXTO_CPF_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
return;
}
digitosCPF.add(dv);
JOptionPane.showMessageDialog(this, TEXTO_CPF_VALIDO, "Sucesso", JOptionPane.INFORMATION_MESSAGE);
}
private void geraDigitosCNPJ() {
new Thread(new Runnable(){
public void run() {
JTextComponent campo = Janela.this.campoCNPJ;
Janela.this.desabilitaCamposCNPJ();
Janela.this.limpaCamposCNPJ();
while(true){
if(campo.getText().length()==12)break;
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
campo.setText(campo.getText()+(int)Math.floor(Math.random()*10));
}
Janela.this.geraDvCNPJ();
Janela.this.habilitaCamposCNPJ();
}
}).start();
}
private void geraDvCNPJ() {
List<Integer> digitosCNPJ = obtemListaDigitos(campoCNPJ);
int soma = 0;
int fator = 5;
for(int digito : digitosCNPJ){
soma += (fator--) * digito;
if(fator<2)fator=9;
}
int resto = soma%11;
digitosCNPJ.add(resto<2?0:11-resto);
soma = 0;
fator = 6;
for(int digito : digitosCNPJ){
soma += (fator--) * digito;
if(fator<2)fator=9;
}
resto = soma%11;
digitosCNPJ.add(resto<2?0:11-resto);
StringBuilder cnpjCompleto = new StringBuilder();
for(int digito : digitosCNPJ){
cnpjCompleto.append(digito);
}
campoVerificadorCNPJ.setText(cnpjCompleto.substring(cnpjCompleto.length()-2, cnpjCompleto.length()));
campoCnpjGerado.setText(cnpjCompleto.toString());
}
private void validaCNPJ() {
List<Integer> digitosCNPJ = obtemListaDigitos(campoCnpjGerado);
if(digitosCNPJ.size()<14){
JOptionPane.showMessageDialog(this, TEXTO_CNPJ_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
return;
}
int[] dvCNPJ = new int[]{digitosCNPJ.remove(digitosCNPJ.size()-2), digitosCNPJ.remove(digitosCNPJ.size()-1)};
int soma = 0;
int fator = 5;
for(int digito : digitosCNPJ){
soma += (fator--) * digito;
if(fator<2)fator=9;
}
int resto = soma%11;
int dv = resto<2?0:11-resto;
if(dv!=dvCNPJ[0]){
JOptionPane.showMessageDialog(this, TEXTO_CNPJ_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
return;
}
digitosCNPJ.add(dv);
soma = 0;
fator = 6;
for(int digito : digitosCNPJ){
soma += (fator--) * digito;
if(fator<2)fator=9;
}
resto = soma%11;
dv = resto<2?0:11-resto;
if(dv!=dvCNPJ[1]){
JOptionPane.showMessageDialog(this, TEXTO_CNPJ_INVALIDO, "Erro", JOptionPane.ERROR_MESSAGE);
return;
}
digitosCNPJ.add(dv);
JOptionPane.showMessageDialog(this, TEXTO_CNPJ_VALIDO, "Sucesso", JOptionPane.INFORMATION_MESSAGE);
}
private List<Integer> obtemListaDigitos(JTextComponent campo) {
String texto = campo.getText();
texto = NAO_NUMEROS.matcher(texto).replaceAll("");
List<Integer> listaDigitos = new ArrayList<Integer>();
for(char c : texto.toCharArray()){
listaDigitos.add(Integer.parseInt(String.valueOf(c)));
}
return listaDigitos;
}
private void filtraNumeros(JTextComponent campo, int tamanho) {
String texto = campo.getText();
texto = NAO_NUMEROS.matcher(campo.getText()).replaceAll("");
if(texto.length()>tamanho){
texto = texto.substring(0, tamanho);
}
if(!campo.getText().equals(texto)){
campo.setText(texto);
}
}
private void habilitaCamposCPF() {
campoCPF.setEnabled(true);
botaoGerarCampoCPF.setEnabled(true);
campoVerificadorCPF.setEnabled(true);
botaoGerarCampoVerificadorCPF.setEnabled(true);
campoCpfGerado.setEnabled(true);
botaoValidarCPF.setEnabled(true);
}
private void desabilitaCamposCPF() {
campoCPF.setEnabled(false);
botaoGerarCampoCPF.setEnabled(false);
campoVerificadorCPF.setEnabled(false);
botaoGerarCampoVerificadorCPF.setEnabled(false);
campoCpfGerado.setEnabled(false);
botaoValidarCPF.setEnabled(false);
}
private void limpaCamposCPF() {
campoCPF.setText(null);
campoVerificadorCPF.setText(null);
campoCpfGerado.setText(null);
}
protected void habilitaCamposCNPJ() {
campoCNPJ.setEnabled(true);
botaoGerarCampoCNPJ.setEnabled(true);
campoVerificadorCNPJ.setEnabled(true);
botaoGerarCampoVerificadorCNPJ.setEnabled(true);
campoCnpjGerado.setEnabled(true);
botaoValidarCNPJ.setEnabled(true);
}
protected void desabilitaCamposCNPJ() {
campoCNPJ.setEnabled(false);
botaoGerarCampoCNPJ.setEnabled(false);
campoVerificadorCNPJ.setEnabled(false);
botaoGerarCampoVerificadorCNPJ.setEnabled(false);
campoCnpjGerado.setEnabled(false);
botaoValidarCNPJ.setEnabled(false);
}
private void limpaCamposCNPJ() {
campoCNPJ.setText(null);
campoVerificadorCNPJ.setText(null);
campoCnpjGerado.setText(null);
}
public static void main(String[] args) {
new Janela();
}
}[/code]