Olá galera,
alguém teria facil uma rotina para calculo modulo 11…
se alguem puder me ajudar …
abs
Olá galera,
alguém teria facil uma rotina para calculo modulo 11…
se alguem puder me ajudar …
abs
public int mod11(int x){
return x % 11 ;
}
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;
}
}
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.
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;
}
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);
}
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
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:
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!
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);
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.
apfmiranda, valeu por corrigir!!
Abraço
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;
}
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 ?
Pessoal, passei por aqui e resolvi deixar uma função que calcula o Módulo11 para digito verificador nosso numero base 2 - 9Peguei 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.
uma dica, comentem a linha 27 e 28 caso queiram que os argumentos de base possam ser trocados, ali está travando eles.