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