En el caso del CUIL/CUIT de Argentina el código de contro de un dígito es el último, por ejemplo 8 para 20-29582925-8. De cualquier manera este código se usa en mucho otros lados, ya que fue diseñado para bancos por HP.
#!/usr/bin/python
# -*- coding: utf-8 -*-
def VerificarModulus11(Numero, CodigoUnDigito):
'''
Input en la forma:
Numero="23-34568734" y CodigoUnDigito="7"
o
Numero=2334568734 y CodigoUnDigito=7
'''
if str(Numero) != Numero:
Numero = str(Numero)
x = 0
factor = 2
for c in reversed(Numero):
try:
int(c)
except ValueError:
# not numeric
continue
else:
# numeric
x += int(c) * factor
factor += 1
if factor == 8:
factor = 2
#Calcula el dígito de control.
Control = (11 - (x % 11)) % 11
#Verifica si el dígito de control ingresado
# difiere con el calculado.
return Control == int(CodigoUnDigito)
if __name__ == '__main__':
print '4 OK'
print VerificarModulus11( '20-29582925', '8' )
print VerificarModulus11( 3065876301, '2' )
print VerificarModulus11( 2029582925, '8' )
print VerificarModulus11( 3065876301, 2 )
print '4 Not OK'
print VerificarModulus11( '20-29582925', '7' )
print VerificarModulus11( 3065876301, '3' )
print VerificarModulus11( 2029582925, '4' )
print VerificarModulus11( 3065876301, 1 )
