Tô precisando de algumas dicas. Eu estive sondando na net e achei o calculo que era feito para validar numero de cpf.
Achei bem interesanto e acho que també é util saber isso, por isso resolvi tentar fazer essa verificação em java, mas estou tendo dificuldade.
Olhem o código que fiz até agora, não sei se estou no caminho certo.
public class ValidaCPF
{
private int [] cpf;
public ValidaCPF()
{
//cria array para receber os digitos do cpf
cpf = new int [11];
}
/*
*metodo para vericar validade do cpf
*/
public void validandoCPF()
{
int mult = 10;
int soma = 0;
int sub = 11;
int i = 0;
//multiplica os 9 primeiros digitos numa sequencia
//decrescente iniciando por 10
while( cpf[i] <= 9 ){
soma = cpf[i] * mult + soma;
i++;
mult--;
}
int div;
int ver;
int ok;
div = soma/11;
ver = div*11;
ok = soma - ver;
//compara o resultado com o digito 10
if(ok == 0 || ok == 1){
cpf[10] = 0;
}
else{
cpf[10] = 11-ok;
}
int multi = 11;
//multiplica os 9 primeiros digitos numa sequencia
//decrescente iniciando por 11
while(cpf[i] <= 9){
soma = cpf[i]*multi+soma;
i++;
multi--;
}
soma = soma+ok;
int div1;
int ver1;
int ok1;
div1 = soma/11;
ver1 = div1*11;
ok1 = soma - ver;
//compara o resultado com o digito 11
if(ok1 == 0 || ok1 == 1){
cpf[11] = 0;
}
else{
cpf[11] = 11-ok1;
}
}
}
Olhando isso que fiz, imagino que preciso escrever um método para receber o indices do array que representarão o cpf, ñ sei como fazer isso.
E lá no final ñ sei como colocar um if para fazer a comparação dos resultados obtidos e retornal verdadeiro ou falso.
Sei que já existem varios códigos para validar cpf, poderia olhar eles, mas quero terminar esse que eu proprio comecei, por isso estou pedindo ajudo a vc’ e não copiando um algoritmo pronto.
Olá amigo, concordo com vc, existem alguns métodos melhores para validação da cpf, mas como vc, quer ver este funcionando ai vai!!!
//Classe que efetua a validação do cpf…
public class ValidaCPF
{
private int [] cpf;
//construtor que espera um array, com o cpf a ser validado
public ValidaCPF(int[] cpf )
{
//cria array para receber os digitos do cpf
this.cpf = cpf;
}
/*
*metodo para vericar validade do cpf
*/
public boolean validandoCPF()
{
int mult = 10;
int soma = 0;
int sub = 11;
int i = 0;
int v1;
int v2;
//multiplica os 9 primeiros digitos numa sequencia
//decrescente iniciando por 10
while( i < 9 ){
soma += (cpf[i] * mult);
i++;
mult–;
}
int div;
int ver;
int ok;
div = soma%11;
//compara o resultado com o digito 10
if(div < 2){
v1 = 0;
}
else{
v1 = 11-div;
}
int multi = 11;
soma = 0;
i=0;
//multiplica os 9 primeiros digitos numa sequencia
//decrescente iniciando por 11
while(i < 10){
soma += cpf[i]*multi;
i++;
multi–;
}
//soma = soma+ok;
int div1;
Fabio_De_Carli cara eu entendi seu código ele compilo e tauz, mas na hora que eu instâncio um objeto e vou digitar os numeros do array, tupo digito 2 e diz que o tipo é incompativel que é esperado um inteiro, no caso 2 seria um inteiro neh?
Cara, se vc quiser te mando um método que eu fiz para o calculo de cpf como tb de cnpj, se estiver interessado é só dar um toque, e se quiser com ja com a interface grafica eu mando …
Desculpe a demora, mas lá vai, lembrando que eu não usei vetores nesse programa, usei uma lógica simples e objetiva, e lá vai:
public void gerar_cpf(String cpf){
char numero;
int comp;
int soma=0;
int controle1=10;
int controle2=11;
if (cpf.length()< 9 ){
JOptionPane.showMessageDialog(null,"Tamanho menor que 9 Digitos !!!");
}
else if (cpf.length()> 9 ){
JOptionPane.showMessageDialog(null,"Tamanho maior que 9 Digitos !!!");
}
else {
for (int i=0;i<9;i++){
numero = cpf.charAt(i);
String num_char = String.valueOf(numero);
soma += Integer.parseInt(num_char) * controle1;
controle1 --;
}//fim do for
comp = soma%11;
if(comp < 2){verif1 = 0;}
else verif1 = 11-comp;
soma=0;
cpf = cpf + verif1;
for (int i=0;i<10;i++){
numero = cpf.charAt(i);
String num_char = String.valueOf(numero);
soma += Integer.parseInt(num_char) * controle2;
controle2--;
}//fim do for
comp = soma%11;
if(comp < 2){verif2 = 0;}
else verif2 = 11-comp;
resultado = resultado + "-"+ verif1+verif2;
lblresul.setText(resultado);
}//fim do else
}//fim do metodo
public void gerar_cnpj(String cnpj){
char numero;
int comp;
int soma=0;
int verif1;
int verif2;
int controle1=5;
int controle2=6;
int controle3=9;
int controle4=9;
if (cnpj.length()< 12 )
{
JOptionPane.showMessageDialog(null,"Tamanho menor que 12 Digitos !!!");
}
else if (cnpj.length()> 12 )
{
JOptionPane.showMessageDialog(null,"Tamanho maior que 12 Digitos !!!");
}
else {
for (int i=0;i<12;i++)
{
numero = cnpj.charAt(i);
String num_char = String.valueOf(numero);
//JOptionPane.showMessageDialog(null,"I igual a "+ String.valueOf(i)+" e numero "+ numero);
if (i < 4)
{
soma += Integer.parseInt(num_char) * controle1;
controle1 --;
}
else
{
soma += Integer.parseInt(num_char) * controle3;
controle3 --;
}
}//fim do for
comp = soma%11;
if(comp < 2){verif1 = 0;}
else verif1 = 11-comp;
soma=0;
cnpj = cnpj + verif1;
for (int i=0;i<13;i++)
{
numero = cnpj.charAt(i);
String num_char = String.valueOf(numero);
if (i < 5)
{
soma += Integer.parseInt(num_char) * controle2;
controle2 --;
}
else
{
soma += Integer.parseInt(num_char) * controle4;
controle4 --;
}
}//fim do for
comp = soma%11;
if(comp < 2){verif2 = 0;}
else verif2 = 11-comp;
resultado = resultado + "-"+ verif1+verif2;
lblresul.setText(resultado);
}//fim do else
}//fim do metodo
Espero ter ajudado, é só chamar o método com o argumento dos digitos do cpf ou cnpj e pronto, e é retornado com os digitos verificadores válidos, qq dúvida pode postar …
Grande Frid, gostei de sua solução.
Eu estava procurando estes dias uma solução mais otimizada e rapida, então acabei lendo sobre regex.
Ai não consegui encontra como fazer isso utilizando este validador, que já vem pronto.
Por ele já vim pronto, tanto diminui o trabalho quanto otimizaria a validação.
Gostei mesmo de sua solução, mas ajude-me a continuar a procura por esta mesma solução utilizando regex.
Opa, qdo eu poder ajudar estamos aí, eu tb não gostei dos códigos que eu achava na net, então eu descobri como fazia o calculo, e coloquei no papel e fui montando em algoritmo, depois codifiquei, o tamanho com os dois métodos ficaram menor que alguns de apenas do cpf, mas então, poste mais ou menos o seu código com regex para tentarmos botar ele pra rodar, blz, abraço …
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Digite o CPF (00000000000): ");
String cpf = sc.nextLine();
if (CPF(cpf)) {
System.out.println ("Dígito válido!");
}
else {
System.out.println ("Dígito inválido!");
}
}
static public boolean CPF (String strCpf )
{
int d1, d2;
int digito1, digito2, resto;
int digitoCPF;
String nDigResult;
d1 = d2 = 0;
digito1 = digito2 = resto = 0;
for (int nCount = 1; nCount < strCpf.length() - 1; nCount++)
{
digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount)).intValue();
//multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.
d1 = d1 + ( 11 - nCount ) * digitoCPF;
//para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.
d2 = d2 + ( 12 - nCount ) * digitoCPF;
};
//Primeiro resto da divisão por 11.
resto = (d1 % 11);
//Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.
if (resto < 2)
digito1 = 0;
else
digito1 = 11 - resto;
d2 += 2 * digito1;
//Segundo resto da divisão por 11.
resto = (d2 % 11);
//Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.
if (resto < 2)
digito2 = 0;
else
digito2 = 11 - resto;
//Digito verificador do CPF que está sendo validado.
String nDigVerific = strCpf.substring (strCpf.length()-2, strCpf.length());
//Concatenando o primeiro resto com o segundo.
nDigResult = String.valueOf(digito1) + String.valueOf(digito2);
//comparar o digito verificador do cpf com o primeiro resto + o segundo resto.
return nDigVerific.equals(nDigResult);
}
}[/code]
Tá ai um código…mude ele se vc quiser…usando array…mas eu acho que desse jeito é mais fácil…
Obs.: Faça buscas antes de criar um novo tópico…na mesma página tinha um tópico sobre isso…
Cara, se vc quiser te mando um método que eu fiz para o calculo de cpf como tb de cnpj, se estiver interessado é só dar um toque, e se quiser com ja com a interface grafica eu mando …
Generosamente,
Frid[/quote]
Frid vlw pelo método achei interesante, já que sou novo nisso, nem sonha que podia receber o numero como String, Mas como disse quando postei minha duvida, quero fazer minha classe funcionar, eu andei pela net e vi que existem varios metodos que fazem esta validação…
Mas valeu peguei seu metodo, vai me servi como estudo…
Opa, qdo eu poder ajudar pode ter certeza que eu ajudo, como vc mesmo disse, tem vários métodos aí na net, o meu pode ser melhorado e muito, eu fiz simples pq antes eu tinha feito em português estruturado, daí passei para o código sem buscar métodos mais avançados, mas como diz meu professor, não tente enfeitar muito o código, basta ser simples e objetivo seguindo os requisitos, rsrsrs, vlw, t+ …