Validador e Gerador de Renavam (Veículos) em Java – Novo Padrão 11 Digitos – A Partir de Abril 2013

Olá Pessoal,

Seguem abaixo 2 classes java para validação e geração de código renavam para veículos:

ValidadorRenavam.java

[sourcecode language=”java”]
public class ValidadorRenavam {

public boolean validarRenavam(String renavam){
// Pegando como exemplo o renavam = 639884962

// Completa com zeros a esquerda se for no padrao antigo de 9 digitos
// renavam = 00639884962
if(renavam.matches("^([0-9]{9})$")){
renavam = "00" + renavam;
}

// Valida se possui 11 digitos pos formatacao
if(!renavam.matches("[0-9]{11}")){
return false;
}

// Remove o digito (11 posicao)
// renavamSemDigito = 0063988496
String renavamSemDigito = renavam.substring(0, 10);

// Inverte os caracteres (reverso)
// renavamReversoSemDigito = 69488936
String renavamReversoSemDigito = new StringBuffer(renavamSemDigito).reverse().toString();

int soma = 0;

// Multiplica as strings reversas do renavam pelos numeros multiplicadores
// para apenas os primeiros 8 digitos de um total de 10
// Exemplo: renavam reverso sem digito = 69488936
// 6, 9, 4, 8, 8, 9, 3, 6
// * * * * * * * *
// 2, 3, 4, 5, 6, 7, 8, 9 (numeros multiplicadores – sempre os mesmos [fixo])
// 12 + 27 + 16 + 40 + 48 + 63 + 24 + 54
// soma = 284
for (int i = 0; i < 8; i++) {
Integer algarismo = Integer.parseInt(renavamReversoSemDigito.substring(i, i + 1));
Integer multiplicador = i + 2;
soma += algarismo * multiplicador;
}

// Multiplica os dois ultimos digitos e soma
soma += Character.getNumericValue(renavamReversoSemDigito.charAt(8)) * 2;
soma += Character.getNumericValue(renavamReversoSemDigito.charAt(9)) * 3;

// mod11 = 284 % 11 = 9 (resto da divisao por 11)
int mod11 = soma % 11;

// Faz-se a conta 11 (valor fixo) – mod11 = 11 – 9 = 2
int ultimoDigitoCalculado = 11 – mod11;

// ultimoDigito = Caso o valor calculado anteriormente seja 10 ou 11, transformo ele em 0
// caso contrario, eh o proprio numero
ultimoDigitoCalculado = (ultimoDigitoCalculado >= 10 ? 0 : ultimoDigitoCalculado);

// Pego o ultimo digito do renavam original (para confrontar com o calculado)
int digitoRealInformado = Integer.valueOf(renavam.substring(renavam.length()-1, renavam.length()));

// Comparo os digitos calculado e informado
if(ultimoDigitoCalculado == digitoRealInformado){
return true;
}
return false;
}
}
[/sourcecode]

GeradorRenavam.java

[sourcecode language=”java”]
import java.util.Random;

public class GeradorRenavam {

public static void main(String[] args) throws Exception {
int maximo = 0;
try {
maximo = Integer.valueOf(args[0]);
} catch (Exception e) {
throw new Exception("Especifique um valor de entrada válido");
}
for (int i = 0; i < maximo; i++) {
String renavam = GeradorRenavam.geraNumeroRenavamValido();
System.out.println(renavam);
}
}

public static String geraNumeroRenavamValido() {
Random randomizador = new Random();
String renavamGeradoAleatoriamente = "";
for (int i = 0; i < 10; i++) {
renavamGeradoAleatoriamente += Math.abs(randomizador.nextInt(8));
}

String renavamSemDigito = renavamGeradoAleatoriamente.substring(0, 10);

String renavamReversoSemDigito = new StringBuffer(renavamSemDigito).reverse().toString();

int soma = 0;
for (int i = 0; i < 8; i++) {
Integer algarismo = Integer.parseInt(renavamReversoSemDigito.substring(i, i + 1));
Integer multiplicador = i + 2;
soma += algarismo * multiplicador;
}

soma += Character.getNumericValue(renavamReversoSemDigito.charAt(8)) * 2;
soma += Character.getNumericValue(renavamReversoSemDigito.charAt(9)) * 3;

int mod11 = soma % 11;
int ultimoDigitoCalculado = 11 – mod11;
ultimoDigitoCalculado = (ultimoDigitoCalculado >= 10 ? 0 : ultimoDigitoCalculado);
return renavamGeradoAleatoriamente + ultimoDigitoCalculado;
}
}
[/sourcecode]

Créditos deste Post para ViniGodoy: Link : http://www.guj.com.br/posts/list/149379.java

Espero que ajude alguém, …
Abraços.

Victor Jabur.