Calculo modulo 11

Olá galera,

alguém teria facil uma rotina para calculo modulo 11…

se alguem puder me ajudar …

abs

isso que voce quer?

[code]public int mod11(int x){

return x % 11 ;
}[/code]

não isso :

O módulo 11 de um número é calculado multiplicando-se cada algarismo pela
seqüência de multiplicadores 2,3,4,5,6,7,8,9,2,3, … posicionados da direita para a esquerda.
A somatória dos resultados das ponderações dos algarismos é dividida por 11 e o
DV (dígito verificador) será a diferença entre o divisor (11) e o resto da divisão:
DV = 11 - (resto da divisão)
Quando o resto da divisão for 0 (zero) ou 1 (um), o DV deverá ser igual a 0 (zero).

Tenho esse que valido CPF:

public static String validaCPF(String cpf)
{
if (cpf.length() < 11) return null;

	String novoCPF = cpf.replaceAll("[.-]","");

	//Testa se o CPF é válido ou não 
	int d1,d4,xx,nCount,resto,digito1,digito2; 
	String Check; 
	String Separadores = "/-."; 
	d1 = 0; d4 = 0; xx = 1; 
	for (nCount = 0; nCount < cpf.length() -2; nCount++) 
	{ 
		String s_aux = cpf.substring(nCount, nCount+1); 

		if (Separadores.indexOf(s_aux) == -1) 
		{ 
			d1 = d1 + ( 11 - xx ) * Integer.valueOf (s_aux).intValue(); 
			d4 = d4 + ( 12 - xx ) * Integer.valueOf (s_aux).intValue(); 
			xx++; 
		}; 
	}; 
	resto = (d1 % 11); 
	if (resto < 2) 
	{ 
		digito1 = 0; 
	} 
	else 
	{ 
		digito1 = 11 - resto; 
	} 

	d4 = d4 + 2 * digito1; 
	resto = (d4 % 11); 
	if (resto < 2) 
	{ 
		digito2 = 0; 
	} 
	else 
	{ 
		digito2 = 11 - resto; 
	} 

	Check = String.valueOf(digito1) + String.valueOf(digito2); 

	String s_aux2 = cpf.substring (cpf.length()-2, cpf.length()); 

	if (s_aux2.compareTo (Check) != 0) 
	{ 
		return null; 
	}
	else
	{
		return novoCPF; 
	} 
}

[quote=paribe]não isso :

O módulo 11 de um número é calculado multiplicando-se cada algarismo pela
seqüência de multiplicadores 2,3,4,5,6,7,8,9,2,3, … posicionados da direita para a esquerda.
A somatória dos resultados das ponderações dos algarismos é dividida por 11 e o
DV (dígito verificador) será a diferença entre o divisor (11) e o resto da divisão:
DV = 11 - (resto da divisão)
Quando o resto da divisão for 0 (zero) ou 1 (um), o DV deverá ser igual a 0 (zero).
[/quote]

Isso não é modulo 11. Modulo 11 é o que o thiagosil escreveu x % 11.
Isso é o algoritmo de validação do CPF que usa um % 11 no meio dos cálculos.
O cerne desse processo é o conjunto de números multiplicadores.

Bicho…O algoritmo tá aqui:

http://www.fundao.wiki.br/articles.asp?cod=23

É bem barbadinha de implementar…

    public static String insereDigitoVerificador(String nfe)
    {
        int[] pesos={4,3,2,9,8,7,6,5};
        int somaPonderada =0;
        for (int i = 0; i < 43; i++)
            somaPonderada += pesos[i%8]*(Integer.parseInt(nfe.substring(i, i+1)));
        return nfe+somaPonderada%11;
    }

[quote=Berkamps]

public static String insereDigitoVerificador(String nfe) { int[] pesos={4,3,2,9,8,7,6,5}; int somaPonderada =0; for (int i = 0; i < 43; i++) somaPonderada += pesos[i%8]*(Integer.parseInt(nfe.substring(i, i+1))); return nfe+somaPonderada%11; } [/quote]

Posso estar errado mas não seria algo assim:

private static int MODULO11 = 11;
.
.
.
public String getChave(String chave){
	int[] pesos={4,3,2,9,8,7,6,5};  
	int somaPonderada = 0;  
	for (int i = 0; i < chave.length(); i++){
		somaPonderada += pesos[i%8]*(Integer.parseInt(chave.substring(i, i+1)));
	}  
	return chave+(MODULO11-somaPonderada%MODULO11);  
}

Pessoal, passei por aqui e resolvi deixar uma função que calcula o Módulo11 para digito verificador nosso numero base 2 - 9

Peguei uma função em php funcional e transportei para java e o melhor, efetuei testes bem sucedidos.

[code]public static int getMod11(String num, int base, int r){
/**
* Autor:
* Douglas Tybel dtybel@yahoo.com.br
*
* Função:
* Calculo do Modulo 11 para geracao do digito verificador
* de boletos bancarios conforme documentos obtidos
* da Febraban - www.febraban.org.br
*
* Entrada:
* $num: string numérica para a qual se deseja calcularo digito verificador;
* $base: valor maximo de multiplicacao [2-$base]
* $r: quando especificado um devolve somente o resto
*
* Saída:
* Retorna o Digito verificador.
*
* Observações:
* - Script desenvolvido sem nenhum reaproveitamento de código existente.
* - Script original de Pablo Costa pablo@users.sourceforge.net
* - Transportado de php para java
* - Exemplo de uso: getMod11(nossoNumero, 9,1)
* - 9 e 1 são fixos de acordo com a base
* - Assume-se que a verificação do formato das variáveis de entrada é feita antes da execução deste script.
*/
base = 9;
r = 0;

int soma = 0;
int fator = 2;
String[] numeros,parcial;
numeros = new String[num.length()+1];
parcial = new String[num.length()+1];

/* Separacao dos numeros */
for (int i = num.length(); i > 0; i--) {
    // pega cada numero isoladamente
    numeros[i] = num.substring(i-1,i);
    // Efetua multiplicacao do numero pelo falor
    parcial[i] = String.valueOf(Integer.parseInt(numeros[i]) * fator);
    // Soma dos digitos
    soma += Integer.parseInt(parcial[i]);
    if (fator == base) {
        // restaura fator de multiplicacao para 2
        fator = 1;
    }
    fator++;

}

/* Calculo do modulo 11 */
if (r == 0) {
    soma *= 10;
    int digito = soma % 11;
    if (digito == 10) {
        digito = 0;
    }
    return digito;
} else {
    int resto = soma % 11;
    return resto;
}

}[/code]

Douglas Tybel

Forma simples


public static void gerarDigitoVerificador(Integer[] codigo) {
		int count = 0;
		int multi = 1;
		int limite = 9;

		List<Integer> listaInt = Arrays.asList(codigo);
		Collections.reverse(listaInt);

		for (int n : codigo) {

			count += (n * (++multi));
			if (multi == limite)
				multi = 1;

		}

		System.out.println("Digito:" + ((count * 10) % 11));

	}[code]

George,

Explica ai pra gente como usa, pois tentei assim:

gerarDigitoVerificador(157914);

e de outras formas, mas dá erro de tipos incompatíveis.
Uso NetBeans 6.8;

Eu fiz um hoje para calcular o digito verificador da chave de acesso de NF-e).
Segue:

[code] String gerarChaveDeAcesso(String chaveSemDigito) throws InputMismatchException{
if(chaveSemDigito.length() != 43){ // UMA CHAVE DE ACESSO DE NF-E TEM 44 DIGITOS, ENTAO O CALCULO SE DÁ COM OS 43 ANTERIORES
throw new InputMismatchException(“Chave Invalida possui “+ chaveSemDigito.length());
}
int [] aux = new int [chaveSemDigito.length()];
int variavel = 2;
int total = 0;
for(int i = aux.length -1; i >=0; i–){
aux[i] = Integer.parseInt(””+chaveSemDigito.charAt(i));
aux[i] = aux[i] * variavel;
variavel++;
if(variavel > 9)
variavel = 2;
total += aux[i];
}
if(total == 0 || total == 1)
total = 0;
else
total = 11 - total;

			String chaveFinal = (chaveSemDigito+total);
			System.out.println(chaveFinal);
			return chaveFinal;
			
}

[/code]

Ps: ainda não testei esse código!

Douglas, boa tarde

Cara vc tem que passar para o método um array de Integer. Pelo que vi, vc passou literalmente os valores ‘157914’ com se fosse uma String.
Ex.:
Integer[] array = new Integer {1,5,7,9,1,4};
gerarDigitoVerificador(array);

[quote=EduardoPinto]Eu fiz um hoje para calcular o digito verificador da chave de acesso de NF-e).
Segue:

[code] String gerarChaveDeAcesso(String chaveSemDigito) throws InputMismatchException{
if(chaveSemDigito.length() != 43){ // UMA CHAVE DE ACESSO DE NF-E TEM 44 DIGITOS, ENTAO O CALCULO SE DÁ COM OS 43 ANTERIORES
throw new InputMismatchException(“Chave Invalida possui “+ chaveSemDigito.length());
}
int [] aux = new int [chaveSemDigito.length()];
int variavel = 2;
int total = 0;
for(int i = aux.length -1; i >=0; i–){
aux[i] = Integer.parseInt(””+chaveSemDigito.charAt(i));
aux[i] = aux[i] * variavel;
variavel++;
if(variavel > 9)
variavel = 2;
total += aux[i];
}
if(total == 0 || total == 1)
total = 0;
else
total = 11 - total;

			String chaveFinal = (chaveSemDigito+total);
			System.out.println(chaveFinal);
			return chaveFinal;

}
[/code]

Ps: ainda não testei esse código! [/quote]

Opa Eduardo,

De acordo com o que especifica o “Manual de Integração - Contribuinte”, ficaria assim:

String gerarChaveDeAcessoNfe(String chaveSemDigito) throws InputMismatchException {
		
		// UMA CHAVE DE ACESSO DE NF-E TEM 44 DIGITOS, ENTAO O CALCULO SE DÁ COM OS 43 ANTERIORES
		if (chaveSemDigito.length() != 43) { 
			throw new InputMismatchException("Chave Invalida possui " + chaveSemDigito.length());
		}
		int[] aux = new int[chaveSemDigito.length()];
		int variavel = 2;
		int total = 0;
		int dv = 0;
		for (int i = aux.length - 1; i >= 0; i--) {
			aux[i] = Integer.parseInt("" + chaveSemDigito.charAt(i));
			aux[i] = aux[i] * variavel;
			variavel++;
			if (variavel > 9)
				variavel = 2;
			total += aux[i];
		}
		
		if (total == 0 || total == 1)
			dv = 0;
		else
			dv = 11 - (total % 11);
		

		String chaveFinal = (chaveSemDigito + dv);
		System.out.println("Digito Verificador: " + dv);
		System.out.println("chave FInal: " + chaveFinal);
		return chaveFinal;

}

Falow.

apfmiranda, valeu por corrigir!!

Abraço

[quote=apfmiranda][quote=EduardoPinto]Eu fiz um hoje para calcular o digito verificador da chave de acesso de NF-e).
Segue:

[code] String gerarChaveDeAcesso(String chaveSemDigito) throws InputMismatchException{
if(chaveSemDigito.length() != 43){ // UMA CHAVE DE ACESSO DE NF-E TEM 44 DIGITOS, ENTAO O CALCULO SE DÁ COM OS 43 ANTERIORES
throw new InputMismatchException(“Chave Invalida possui “+ chaveSemDigito.length());
}
int [] aux = new int [chaveSemDigito.length()];
int variavel = 2;
int total = 0;
for(int i = aux.length -1; i >=0; i–){
aux[i] = Integer.parseInt(””+chaveSemDigito.charAt(i));
aux[i] = aux[i] * variavel;
variavel++;
if(variavel > 9)
variavel = 2;
total += aux[i];
}
if(total == 0 || total == 1)
total = 0;
else
total = 11 - total;

			String chaveFinal = (chaveSemDigito+total);
			System.out.println(chaveFinal);
			return chaveFinal;

}
[/code]

Ps: ainda não testei esse código! [/quote]

Opa Eduardo,

De acordo com o que especifica o “Manual de Integração - Contribuinte”, ficaria assim:

String gerarChaveDeAcessoNfe(String chaveSemDigito) throws InputMismatchException {
		
		// UMA CHAVE DE ACESSO DE NF-E TEM 44 DIGITOS, ENTAO O CALCULO SE DÁ COM OS 43 ANTERIORES
		if (chaveSemDigito.length() != 43) { 
			throw new InputMismatchException("Chave Invalida possui " + chaveSemDigito.length());
		}
		int[] aux = new int[chaveSemDigito.length()];
		int variavel = 2;
		int total = 0;
		int dv = 0;
		for (int i = aux.length - 1; i >= 0; i--) {
			aux[i] = Integer.parseInt("" + chaveSemDigito.charAt(i));
			aux[i] = aux[i] * variavel;
			variavel++;
			if (variavel > 9)
				variavel = 2;
			total += aux[i];
		}
		
		if (total == 0 || total == 1)
			dv = 0;
		else
			dv = 11 - (total % 11);
		

		String chaveFinal = (chaveSemDigito + dv);
		System.out.println("Digito Verificador: " + dv);
		System.out.println("chave FInal: " + chaveFinal);
		return chaveFinal;

}

Falow.
[/quote]

Mais uma correção e ai sim ta pronto rs…

[code]

String gerarChaveDeAcessoNfe(String chaveSemDigito) throws InputMismatchException {  
          
        // UMA CHAVE DE ACESSO DE NF-E TEM 44 DIGITOS, ENTAO O CALCULO SE DÁ COM OS 43 ANTERIORES  
        if (chaveSemDigito.length() != 43) {   
            throw new InputMismatchException("Chave Invalida possui " + chaveSemDigito.length());  
        }  
        int[] aux = new int[chaveSemDigito.length()];  
        int variavel = 2;  
        int total = 0;  
        int dv = 0;  
        for (int i = aux.length - 1; i >= 0; i--) {  
            aux[i] = Integer.parseInt("" + chaveSemDigito.charAt(i));  
            aux[i] = aux[i] * variavel;  
            variavel++;  
            if (variavel > 9)  
                variavel = 2;  
            total += aux[i];  
        }  
         total = total % 11 //Porque o total é divido por onze após as somas...
        if (total == 0 || total == 1)  
            dv = 0;  
        else  
            dv = 11 - total;  
          
  
        String chaveFinal = (chaveSemDigito + dv);  
        System.out.println("Digito Verificador: " + dv);  
        System.out.println("chave FInal: " + chaveFinal);  
        return chaveFinal;  
  
}

Olá pessoal, preciso de um algoritmo para validar os digitos verificadores(sim são 2)
de um número de 30 caracteres… posso utilizar algum dos citados acima ?

[quote=dtybel]Pessoal, passei por aqui e resolvi deixar uma função que calcula o Módulo11 para digito verificador nosso numero base 2 - 9

Peguei uma função em php funcional e transportei para java e o melhor, efetuei testes bem sucedidos.

[code]public static int getMod11(String num, int base, int r){
/**
* Autor:
* Douglas Tybel dtybel@yahoo.com.br
*
* Função:
* Calculo do Modulo 11 para geracao do digito verificador
* de boletos bancarios conforme documentos obtidos
* da Febraban - www.febraban.org.br
*
* Entrada:
* $num: string numérica para a qual se deseja calcularo digito verificador;
* $base: valor maximo de multiplicacao [2-$base]
* $r: quando especificado um devolve somente o resto
*
* Saída:
* Retorna o Digito verificador.
*
* Observações:
* - Script desenvolvido sem nenhum reaproveitamento de código existente.
* - Script original de Pablo Costa pablo@users.sourceforge.net
* - Transportado de php para java
* - Exemplo de uso: getMod11(nossoNumero, 9,1)
* - 9 e 1 são fixos de acordo com a base
* - Assume-se que a verificação do formato das variáveis de entrada é feita antes da execução deste script.
*/
base = 9;
r = 0;

int soma = 0;
int fator = 2;
String[] numeros,parcial;
numeros = new String[num.length()+1];
parcial = new String[num.length()+1];

/* Separacao dos numeros */
for (int i = num.length(); i > 0; i--) {
    // pega cada numero isoladamente
    numeros[i] = num.substring(i-1,i);
    // Efetua multiplicacao do numero pelo falor
    parcial[i] = String.valueOf(Integer.parseInt(numeros[i]) * fator);
    // Soma dos digitos
    soma += Integer.parseInt(parcial[i]);
    if (fator == base) {
        // restaura fator de multiplicacao para 2
        fator = 1;
    }
    fator++;

}

/* Calculo do modulo 11 */
if (r == 0) {
    soma *= 10;
    int digito = soma % 11;
    if (digito == 10) {
        digito = 0;
    }
    return digito;
} else {
    int resto = soma % 11;
    return resto;
}

}[/code]

Douglas Tybel[/quote]

Tem o módulo 10 também amigo?? vi umas outras aqui mas nenhuma atende ao febrabam 100% como a sua.

uma dica, comentem a linha 27 e 28 caso queiram que os argumentos de base possam ser trocados, ali está travando eles.