2009年6月15日月曜日

ISBN

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
wikipediaを参考にvalidatorを書いてみた.感想としては画面が広いと作業しやすい.コードが一度にたくさん見ることができるのは有利.参考資料もすべて開いておける.しかし,やってみると,使いきることができるものだ.もう広さを感じなくなりつつある.


import sys
import re

class ISBN:
pass


class ISBN10(ISBN):
pattern = re.compile('\d{9}(\d|X)')
@classmethod
def isvalid(cls, s):
"""
>>> ISBN10.isvalid('foobar')
False
>>> ISBN10.isvalid('4101092052')
True
>>> ISBN10.isvalid('4101092053')
False
"""
mo = cls.pattern.match(s)
if mo is None:
return False
parity = 0
for i, d in enumerate(s[:9]):
parity += int(d) * (10 - i)
return s[9] == ('0123456789X'[(11 - parity % 11 )])

class ISBN13(ISBN):
pattern = re.compile('\d{13}')
@classmethod
def isvalid(cls, s):
"""
>>> ISBN13.isvalid('foobar')
False
>>> ISBN13.isvalid('9784101092058')
True
>>> ISBN13.isvalid('9784101092057')
False
"""
mo = cls.pattern.match(s)
if mo is None:
return False
parity = 0
for i, d in enumerate(s[:12]):
parity += int(d) * (1+2*(i%2))
return (10 - parity % 10 ) == int(s[12])


def main():
for line in sys.stdin:
pass

if __name__ == '__main__':
import doctest
doctest.testmod()


追記:
既存のものにはこういうのがある.JANコードの意味とかが分かるらしい.

0 件のコメント: