Gdyby ktoś potrzebował, to poniżej są przykłady sprawdzanie numerów PESEL, REGON i NIP zaimplementowane w Pythonie:

PESEL
def check_pesel(pesel):
  sum, ct = 0, [1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1]
  for i in range(11):
    sum += (int(P[i]) * ct[i])
  return (str(sum)[-1] == '0')
REGON
def check_regon(regon):
  sum = 0
  w = [8, 9, 2, 3, 4, 5, 6, 7]
  if len(regon) == 7:
    w = w[2:]
  elif len(regon) == 14:
    # ciężko znaleźć algorytm (wagi) do sprawdzenia ostatnich
    # pięciu cyfr, więc olewamy
    regon = regon[:9]

  ct = int(regon[-1])

  for i in range(len(w)):
    sum += (int(R[i]) * w[i])
  mod = sum%11
  if (mod == ct) or (mod == 10 and ct == 0):
    return True
  return False
NIP
def check_nip(nip):
  sum, ct = 0, [6, 5, 7, 2, 3, 4, 5, 6, 7]
  for i in range(9):
    sum += (int(N[i]) * ct[i])
  return ((sum%11) == int(nip[-1]))

Sumy kontrolne są liczone według wzorów dostarczonych przez Wikipedię: PESEL, REGON, NIP.

Oczywiście powyższe funkcje zakładają że dostają poprawny numer, walidację tego pozostaje zrobić we własnym zakresie…

UPDATE

Poprawiłem nieco funkcję sprawdzającą REGON - uwzględnia ona teraz REGONy zarówno 7 (stare), jak i 9 czy 14 cyfrowe (te ostatnie, to “zwykły” REGON wraz z 5 cyframi lokalizacyjnymi - więcej: wipos.p.lodz.pl/zylla/ut/nip-rego.html).


A Ty? Co o tym myślisz?

Możesz używać w komentarzach następujących znaczników:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Sblam! Antyspam