Here it is:
def isValidAFM(afm): if len(afm) != 9: return False try: int(afm) except ValueError: return False AFMpart = afm[:-1] afmsum = 0 multiplier = 2 for c in AFMpart[::-1]: afmsum += ( int(c) * multiplier ) multiplier *= 2 if not afmsum: return False afmmod = afmsum % 11 lastdigit = int(afm[-1]) if lastdigit == afmmod: return True elif (lastdigit == 0) and (afmmod ==10 ): return True else: return False
Caveats:
- I don’t know if the actual algorithm is valid since my search for official documentation turned up nothing. It seems to be accepted by a large on-line community of accountants though, and that’s good enough for me.
- I have not tested it much. You at your own risk, as always