From 92e18aa4f0eeda3d48ea33f6399cc9130bc241ef Mon Sep 17 00:00:00 2001 From: Arthur de Jong Date: Fri, 23 Jul 2010 14:46:37 +0000 Subject: 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 --- stdnum/issn.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 stdnum/issn.py 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:] -- cgit v1.2.3