Ir ao conteúdo
  • Cadastre-se

Sintaxe Java - Digito Verificador do Código Rastreio dos Correios


cpdmg

Posts recomendados

public class DvVerificador { 
	public static void main(String[] args) { 
		System.out.println(geraEtiquetaComDigitoVerificador("15653850")); 
} 
// Exemplo e-ticket 15653829 (dv=7) 

public static String geraEtiquetaComDigitoVerificador(String numeroEtiqueta) { 

	Integer[] multiplicadores = {8, 6, 4, 2, 3, 5, 9, 7}; 
	Integer soma = 0; 
	String dv; 

if (numeroEtiqueta.length() != 8) { 
	numeroEtiqueta = "Error"; 
	} else { 
	for (int i = 0; i < 8; i++) { 
		soma += new Integer(numeroEtiqueta.substring(i, (i + 1))) * multiplicadores[i]; 
	} 
	Integer resto = soma % 11; 
	
	if (resto == 0) { 
		dv = "5"; 
	} else if (resto == 1) { 
		dv = "0"; 
	} else { 
		dv = new Integer(11 - resto).toString(); 
	} 
	numeroEtiqueta += dv; 
	} 
	return numeroEtiqueta; 
	} 
}

Duvida 01: Quando eu tenho o seguinte comando

Integer[] multiplicadores = {8, 6, 4, 2, 3, 5, 9, 7};

ele está criando uma matriz, e respeitando a ordem: 
primeiro numero = 8
segundo numero = 6 e assim sucessivamente???

 

Duvida 02: Quando eu tenho o seguinte comando

for (int i = 0; i < 8; i++)

seria um loop, onde i começa com 0, não pode ser maior ou igual a 8, e i++ significa que ele auto incrementa?
 

Duvida 03: Quando eu tenho o seguinte comando

for (int i = 0; i < 8; i++) { soma += new Integer(numeroEtiqueta.substring(i, (i + 1))) * multiplicadores; }

ele começando o i = 0 no substring não vai dar erro?

algoritimo.jpg

Link para o comentário
Compartilhar em outros sites

1) Sim.. os itens na matrix estarão na ordem que eles foram atribuidos

multiplicadores[0] = 8, multiplicadores[1] = 6 e por ai vai

 

2) Sim , O loop começa com i=0 e vai incrementando o valor de i ate ele ser menor que 8 (ou seja, ate o 7 ele entra no loop, com 8 ele sai).. Isso é feito para percorrer multiplicadores , lembre sempre que o primeiro indice da matrix é sempre 0, se tem 8 elementos, o ultimo indice é 7

 

3)  Não por que uma string em java tambem é uma matriz (ou array de caracteres), então a posição nessa matriz de caracteres tambem é zero, então ele ta pegando uma substrig que pega o primeiro digito da string ate a posição seguinte , no caso 0 + 1 , vezes o multiplicado... 

 

no caso do exemplo, no primeiro laço a substring para i =0 é , 

da posição 0 ate a posição 1 e multipicar por 8 = ou seja 15 x 8

ou seja 15653850

para i = 1

ele vai pegar string da posição 1 ate a posição (1+1) =2 (fica '56')  e Multiplica por 6... e por ai vai... 

Link para o comentário
Compartilhar em outros sites

@bngomes , muito obrigado pelos esclarecimentos, trabalho com SQL e as estruturas são um pouco diferente

 

estou tentando simular esse algorítimo para compreender como é calculado o digito verificador, fiz duas simulações usando o raciocínio que entendi, gostaria que me corrijam se estiver errado.

 

Onde:

Resto = Soma / 11

dv = 11-resto

algoritimo 2 .jpg

Link para o comentário
Compartilhar em outros sites

Seu resto ta errado na planilha 2.. voce pegou 1670 e dividiu por 11.. isso não resto.. esse é o valor da divisão..  o resto de 1670 é 9 no caso do planilha 2 o dv seria 2

 

tem um erro que eu percebi no exemplo que eu te dei.. ele pega a posição de um numero so

 

São sempre a 8 digitos então a formula é simples.. 1 digito x 8, segundo digito x 6 , e etc

 

logo para o numero do exemplo

 

1 x 8 = 8

5 x 6 =30

6 x 4 = 24

5 x 2 = 10

3 x 3 = 9

8 x 5 = 40

2 x 9 = 18

9 x 7  = 63

 

Total = 202

Resto da Divisão = 4

Digito =  11 - 4 = 7

 

Link para o comentário
Compartilhar em outros sites

Que eu saiba é assim mesmo a sintaxe é substring(pos inicial,posição final)

 

da documentação do Java:

 

substring

public String substring(int beginIndex, int endIndex)

Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.

Examples:

"hamburger".substring(4, 8) returns "urge" "smiles".substring(1, 5) returns "mile"

Parameters:

beginIndex - the beginning index, inclusive.

endIndex - the ending index, exclusive.

Returns:

the specified substring.

Throws:

IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.

 

 

 

 

Link para o comentário
Compartilhar em outros sites

@bngomes muito obrigado mesmo... consegui montar um script que me atende em sql

 

 

declare @soma int, @contador int, @digito int, @valor varchar(8), @resto int

set @soma  = 0
set @contador = 1
set @valor = 97476052

set @soma = @soma + (substring(@valor,@contador,@contador) * 8) /*n1*/
set @soma = @soma + (substring(@valor,@contador+1,@contador) * 6) /*n2*/
set @soma = @soma + (substring(@valor,@contador+2,@contador) * 4) /*n3*/
set @soma = @soma + (substring(@valor,@contador+3,@contador) * 2) /*n4*/
set @soma = @soma + (substring(@valor,@contador+4,@contador) * 3) /*n5*/
set @soma = @soma + (substring(@valor,@contador+5,@contador) * 5) /*n6*/
set @soma = @soma + (substring(@valor,@contador+6,@contador) * 9) /*n7*/
set @soma = @soma + (substring(@valor,@contador+7,@contador) * 7) /*n8*/

set @resto = @soma%11
set @digito = case when @resto = 0 then  5 when @resto = 1 then  0 else 11 - @resto end
select @digito digito

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...