Skip to content

Instantly share code, notes, and snippets.

@biazzotto
Last active February 3, 2017 10:42
Show Gist options
  • Save biazzotto/226d241fa310d8acf016683e5c34e811 to your computer and use it in GitHub Desktop.
Save biazzotto/226d241fa310d8acf016683e5c34e811 to your computer and use it in GitHub Desktop.
Função para validar sequência de dígitos do Renavam
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Função para validar sequência de dígitos do Renavam.
# Adaptado por Fabricio Biazzotto, a partir do original, feito em java:
# http://blog.victorjabur.com/2010/05/28/renavam_veiculos_java
def validar_renavam(renavam):
# Retorna falso caso o valor passado não seja um número inteiro
if type(renavam) != int:
return False
# Converte renavam em string e completa com zeros à esquerda,
# para que fique com 11 dígitos
renavam = str(renavam).zfill(11)
# Soma dos produtos dos 10 primeiros dígitos do renavam com os de controle
controle = '3298765432' # Valores fixos
soma = sum(int(a) * int(m) for a, m in zip(controle, renavam[:-1]))
# Calcula a diferença entre 11 e o resto da divisão da soma por 11
digito = 11 - (soma % 11)
# Caso o digito seja maior que 9, passa a ser 0
digito = (digito if digito < 10 else 0)
# Compara o dígito calculado com o original
return int(digito) == int(renavam[-1])
teste = 639884962
print('O renavam {} é {}.'.
format(teste, 'válido' if validar_renavam(teste) else 'inválido'))
@biazzotto
Copy link
Author

biazzotto commented Dec 24, 2016

Há uma alternativa para o cálculo do dígito, que obtive em http://gerador.info/renavam#collapseModulo11, basta substitui as linhas:

20     soma = sum(int(a) * int(m) for a, m in zip(controle, renavam[:-1]))
23     digito = 11 - (soma % 11)

por:

20     soma = 10 * sum(int(a) * int(m) for a, m in zip(controle, renavam[:-1]))
23     digito = soma % 11

Isso só funciona porque o dígito é corrigido posteriormente na linha 26:

26    digito = (digito if digito < 10 else 0)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment