Como realizar la validación de un Cif en Python
Ayer escribí una rutina para validar números NIF, hoy toca para CIF. en España se utiliza el Código de Identificación Fiscal (CIF) para la identificación tributaria de personas jurídicas.
def validate_cif(value):
value = unicode(value).upper()
match = re.match('(?P<letra>[A-H]|[J-N]|[P-S]|[UVW])(?P<numeracion>\d{7})(?P<control>[0-9A-J])', value)
if match is None:
match = re.match('(?P<letra>[A-H]|[J-N]|[P-S]|[UVW])-(?P<numeracion>\d{7})(?P<control>[0-9A-J])', value)
if match is None:
raise Expection
LETRAS_CIF = 'ABCDEFGHJKLMNPQRSUVW' # Letras de CIF válidas
DC_NUMERICO_CIF = 'ABEH' # CIFs con número como dígito de control
DC_LETRA_CIF = 'KPQS' # CIFs con letra como dígito de control
ALPHA_CIF = 'JABCDEFGHI' # Correspondencia entre letra y dígito de control
# Obtenemos la información
letra = match.group('letra')
numeracion = match.group('numeracion')
control = match.group('control')
# No todas las letras son válidas
if letra not in LETRAS_CIF:
raise Expection
# Suma de los pares
a = reduce(lambda x, y: int(x)+int(y), numeracion[1::2])
# Suma de la suma de los dígitos de los impares * 2
b = sum(
[
int(reduce(lambda x,y: int(x)+int(y), impar))
for impar in map(lambda x: unicode(int(x)*2), numeracion[::2])
]
)
c = a + b
e = c % 10
d = (10-e) % 10
# Obtenemos el dígito de control
if letra in DC_NUMERICO_CIF:
d = unicode(d) # Es numérico
elif letra in DC_LETRA_CIF:
d = ALPHA_CIF[d] # Es una letra
else:
# Puede ser tanto letra como número
if control.isalpha():
d = ALPHA_CIF[d]
else:
d = unicode(d)
if d != control:
raise Expection
return unicode('%s%s%s' % (letra, numeracion, control))
Tags
La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.
