diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2010-07-23 16:46:37 +0200 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2010-07-23 16:46:37 +0200 |
commit | 92e18aa4f0eeda3d48ea33f6399cc9130bc241ef (patch) | |
tree | ce64abcb66a8484a44d403b5605326847ac2b443 | |
parent | 31ce783a85739e559ec46ae1a43bcea32cdfea80 (diff) |
add an ISSN (International Standard Serial Number) module
git-svn-id: http://arthurdejong.org/svn/python-stdnum/python-stdnum@4 9dea7c4f-944c-4273-ac1a-574ede026edc
-rw-r--r-- | stdnum/issn.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/stdnum/issn.py b/stdnum/issn.py new file mode 100644 index 0000000..1cc3a13 --- /dev/null +++ b/stdnum/issn.py @@ -0,0 +1,57 @@ +# issn.py - functions for handling ISSNs +# +# Copyright (C) 2010 Arthur de Jong +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""Module for handling ISSNs (International Standard Serial Number), the +standard internation code to identify serial publications. + +>>> validate('0024-9319') +True +>>> validate('0032147X') # incorrect check digit +False +>>> compact('0032-1478') +'00321478' +>>> format('00249319') +'0024-9319' +""" + + +def compact(number): + """Convert the ISSN to the minimal representation. This strips the number + of any valid ISSN separators and removes surrounding whitespace.""" + number = number.replace(' ','').replace('-','').strip().upper() + return number + +def _calc_check_digit(number): + """Calculate the ISBN check digit for 10-digit numbers. The number passed + should not have the check bit included.""" + check = (11 - sum( (8 - i) * int(number[i]) for i in range(len(number)) ) ) % 11 + return 'X' if check == 10 else str(check) + +def validate(number): + """Checks to see if the number provided is a valid ISSN. This checks + the length and whether the check digit is correct.""" + number = compact(number) + return len(number) == 8 and \ + number[:-1].isdigit() and \ + _calc_check_digit(number[:-1]) == number[-1] + +def format(number): + """Reformat the passed number to the standard format.""" + number = compact(number) + return number[:4] + '-' + number[4:] |