Recentemente precisei de um método que calculasse o digito verificador (DV) na base10 e na base11. Não consegui encontrar cálculo para a Base10 e os da Base11 se encontravam errados. Resolvi implementar duas classes, e depois de muitos testes com sucesso, decidi postar aqui pra ajudar a quem precisar.
Abraço a todos e sucesso!!!
Allan Tenorio
BASE10
/**
* @author :Allan Tenorio
* @since :10/07/2012
* @see :Calculo do Modulo 10 para geracao do digito verificador de boletos bancários.
*/
//Módulo 10
//Conforme o esquema abaixo, cada dígito do número, começando da direita para a esquerda
//(menos significativo para o mais significativo) é multiplicado, na ordem, por 2, depois 1, depois 2, depois 1 e
//assim sucessivamente.
//Em vez de ser feito o somatório das multiplicações, será feito o somatório dos dígitos das multiplicações
//(se uma multiplicação der 12, por exemplo, será somado 1 + 2 = 3).
//O somatório será dividido por 10 e se o resto (módulo 10) for diferente de zero, o dígito será 10 menos este valor.
//Número exemplo: 261533-4
// +---+---+---+---+---+---+ +---+
// | 2 | 6 | 1 | 5 | 3 | 3 | - | 4 |
// +---+---+---+---+---+---+ +---+
// | | | | | |
// x1 x2 x1 x2 x1 x2
// | | | | | |
// =2 =12 =1 =10 =3 =6
// +---+---+---+---+---+-> = (16 / 10) = 1, resto 6 => DV = (10 - 6) = 4
public class CalculaBase10 {
public int getMod10(String num){
//variáveis de instancia
int soma = 0;
int resto = 0;
int dv = 0;
String[] numeros = new String[num.length()+1];
int multiplicador = 2;
String aux;
String aux2;
String aux3;
for (int i = num.length(); i > 0; i--) {
//Multiplica da direita pra esquerda, alternando os algarismos 2 e 1
if(multiplicador%2 == 0){
// pega cada numero isoladamente
numeros[i] = String.valueOf(Integer.valueOf(num.substring(i-1,i))*2);
multiplicador = 1;
}else{
numeros[i] = String.valueOf(Integer.valueOf(num.substring(i-1,i))*1);
multiplicador = 2;
}
}
// Realiza a soma dos campos de acordo com a regra
for(int i = (numeros.length-1); i > 0; i--){
aux = String.valueOf(Integer.valueOf(numeros[i]));
if(aux.length()>1){
aux2 = aux.substring(0,aux.length()-1);
aux3 = aux.substring(aux.length()-1,aux.length());
numeros[i] = String.valueOf(Integer.valueOf(aux2) + Integer.valueOf(aux3));
}
else{
numeros[i] = aux;
}
}
//Realiza a soma de todos os elementos do array e calcula o digito verificador
//na base 10 de acordo com a regra.
for(int i = numeros.length; i > 0 ; i--){
if(numeros[i-1] != null){
soma += Integer.valueOf(numeros[i-1]);
}
}
resto = soma%10;
dv = 10 - resto;
//retorna o digito verificador
return dv;
}
}
BASE11
/**
* @author :Allan Tenorio
* @since :11/07/2012
* @see :Calculo do Modulo 11 para geracao do digito verificador de boletos bancários.
*/
//Módulo 11
//Conforme o esquema abaixo, para calcular o primeiro dígito verificador, cada dígito do número,
//começando da direita para a esquerda (do dígito menos significativo para o dígito mais significativo)
//é multiplicado, na ordem, por 2, depois 3, depois 4 e assim sucessivamente, até o primeiro dígito do número.
//O somatório dessas multiplicações dividido por 11. O resto desta divisão (módulo 11) é subtraido da base (11),
//o resultado é o dígito verificador. Para calcular o próximo dígito, considera-se o dígito anterior como parte
//do número e efetua-se o mesmo processo. No exemplo, foi considerado o número 261533:
// +---+---+---+---+---+---+ +---+
// | 2 | 6 | 1 | 5 | 3 | 3 | - | 9 |
// +---+---+---+---+---+---+ +---+
// | | | | | |
// x7 x6 x5 x4 x3 x2
// | | | | | |
// =14 =36 =5 =20 =9 =6 soma = 90
// +---+---+---+---+---+-> = (90 / 11) = 8,1818 , resto 2 => DV = (11 - 2) = 9
public class CalculaBase11 {
public int getMod11(String num){
//variáveis de instancia
int soma = 0;
int resto = 0;
int dv = 0;
String[] numeros = new String[num.length()+1];
int multiplicador = 2;
for (int i = num.length(); i > 0; i--) {
//Multiplica da direita pra esquerda, incrementando o multiplicador de 2 a 9
//Caso o multiplicador seja maior que 9 o mesmo recomeça em 2
if(multiplicador > 9){
// pega cada numero isoladamente
multiplicador = 2;
numeros[i] = String.valueOf(Integer.valueOf(num.substring(i-1,i))*multiplicador);
multiplicador++;
}else{
numeros[i] = String.valueOf(Integer.valueOf(num.substring(i-1,i))*multiplicador);
multiplicador++;
}
}
//Realiza a soma de todos os elementos do array e calcula o digito verificador
//na base 11 de acordo com a regra.
for(int i = numeros.length; i > 0 ; i--){
if(numeros[i-1] != null){
soma += Integer.valueOf(numeros[i-1]);
}
}
resto = soma%11;
dv = 11 - resto;
//retorna o digito verificador
return dv;
}
}