Calculo modulo 11

18 respostas
P

Olá galera,

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

se alguem puder me ajudar …

abs

18 Respostas

T
isso que voce quer?
public int mod11(int x){

return x % 11 ;
}
P

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).

W

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; 
	} 
}
S

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).

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.

E

Bicho…O algoritmo tá aqui:

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

É bem barbadinha de implementar…

B
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;
    }
D

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; }

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);  
}
D

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.

public static int getMod11(String num, int base, int r){
    /**
     *   Autor:
     *           Douglas Tybel <[email removido]>
     *
     *   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 <[email removido]>
     *     - 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;
    }
}

Douglas Tybel

G

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]
D

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;

E

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

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;
				
	}

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

G

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);
A
EduardoPinto:
Eu fiz um hoje para calcular o digito verificador da chave de acesso de NF-e). Segue:
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;
				
}

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

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.

E

apfmiranda, valeu por corrigir!!

Abraço

E
apfmiranda:
EduardoPinto:
Eu fiz um hoje para calcular o digito verificador da chave de acesso de NF-e). Segue:
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;
				
}

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

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.

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;

}

A

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 ?

D
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.

public static int getMod11(String num, int base, int r){
    /**
     *   Autor:
     *           Douglas Tybel <[email removido]>
     *
     *   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 <[email removido]>
     *     - 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;
    }
}

Douglas Tybel

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

D

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

Criado 17 de julho de 2008
Ultima resposta 4 de jun. de 2013
Respostas 18
Participantes 13