Calcula DV Base10 e Base11

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

Putz velho muito boa obrigado xD

Poxa, é difícil ver gente que posta soluções aqui no fórum de cara, muito bom colega!

Só uma dica, te recomendo mudar o nome do tópico para “Como calcular dígito verificador(DV) Base10 e Base11”…

Fica melhor pra quem pesquisar! :wink:

Muito OBRIGADO! Será muito útil

Brigadão, me foi útil, Deus lhe abençoe.

Precisei utilizar a implementação gentilmente disponibilizada pelo colega acima, porem tem um detalhe que faltou para cálculo do modulo 11
para quem for utilizar esse metodo, como eu…LEMBRANDO QUE, ao menos essa regra consta no manual sispag para validação de código de barras de boletos bancários
nao sei se serve para TODOS os casos.

“Se o resultado desta for igual a 0, 1, 10 ou 11, considerem DV = 1”
fonte:


pagina 57.

ou seja, o código fica assim:

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;  
        if(dv > 9 || dv == 0 ){
           dv = 1; 
        }
          
        //retorna o digito verificador  
        return dv;  
    }  
}