1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- # coding=utf-8
- """
- This module is responsible for generating the check digit and formatting
- ISBN numbers.
- """
- class ISBN(object):
- MAX_LENGTH = 13
- def __init__(self, ean=None, group=None, registrant=None, publication=None):
- self.ean = ean
- self.group = group
- self.registrant = registrant
- self.publication = publication
- class ISBN13(ISBN):
- def __init__(self, *args, **kwargs):
- super(ISBN13, self).__init__(*args, **kwargs)
- self.check_digit = self._check_digit()
- def _check_digit(self):
- """ Calculate the check digit for ISBN-13.
- See https://en.wikipedia.org/wiki/International_Standard_Book_Number
- for calculation.
- """
- weights = (1 if x % 2 == 0 else 3 for x in range(12))
- body = ''.join([self.ean, self.group, self.registrant,
- self.publication])
- remainder = sum(int(b) * w for b, w in zip(body, weights)) % 10
- diff = 10 - remainder
- check_digit = 0 if diff == 10 else diff
- return str(check_digit)
- def format(self, separator=''):
- return separator.join([self.ean, self.group, self.registrant,
- self.publication, self.check_digit])
- class ISBN10(ISBN):
- def __init__(self, *args, **kwargs):
- super(ISBN10, self).__init__(*args, **kwargs)
- self.check_digit = self._check_digit()
- def _check_digit(self):
- """ Calculate the check digit for ISBN-10.
- See https://en.wikipedia.org/wiki/International_Standard_Book_Number
- for calculation.
- """
- weights = range(1, 10)
- body = ''.join([self.group, self.registrant, self.publication])
- remainder = sum(int(b) * w for b, w in zip(body, weights)) % 11
- check_digit = 'X' if remainder == 10 else str(remainder)
- return str(check_digit)
- def format(self, separator=''):
- return separator.join([self.group, self.registrant, self.publication,
- self.check_digit])
|