Pythonでモジュラス10ウエイト3とisbn10to13

Guidelines For Shipping Container Labeling http://www.bisg.org/docs/shipping_label_guidelines_09-2005.pdf
こんなのをやるにあたって、ちゃんとしたモジュラス10ウエイト3のチェックデジットを計算する必要があったので作った。

ついでに、isbnlib.pyよりもシンプルに10桁ISBNを13桁にする関数も。

Python版

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""モジュラス10ウエイト3とISBNのチェックデジット計算。Python版。
"""
def m10w31(code):
    """モジュラス10ウエイト3チェックデジットの計算
    """
    s = list(str(code))
    s.reverse()
    sum = 0

    w = 3
    for i in s:
        sum = sum + (int(i) * w)
        if w == 3: w = 1
        else: w = 3

    d = sum % 10
    if d<>0: d = 10 - d
    return str(d)

def isbn10to13(isbn10):
    """10桁ISBNを13桁ISBNに変換
    """
    s = '978'+isbn10[:9]
    return s+m10w31(s)

def ssccBarCode(isbn13):
    """ SSCC bar code
     See, http://www.bisg.org/docs/shipping_label_guidelines_09-2005.pdf
    """
    PRFX1='01'
    PRFX2='1'
    code = isbn13[:12]
    return "(%s)%s %s-%s" % (PRFX1, PRFX2, code, m10w31(PRFX2+code))

if __name__=='__main__':
    data = ('4770025364','4770023230','4770015419','4881359290','4883731626','4873112109')
    for isbn10 in data:
         isbn13 = isbn10to13(isbn10)
         print " %s -> %s -> %s" % (isbn10,isbn13,ssccBarCode(isbn13))

Delphi版は関数だけ

function m10w31(code: string): integer;
/**
 Delphi版 モジュラス10ウエィト3のチェックデジット計算。
*/
var
  i,w,sum: integer;
begin
  w := 3;
  sum := 0;
  for i := length(code) downto 1 do
  begin
    sum := sum + strtoint(code[i]) * w;
    if w = 3 then w := 1
    else w := 3;
  end;
  Result := sum mod 10;
  if Result<>0 then Result := 10 - Result;
end;

最新版はgithubをどうぞ。
Python版Delphi版

人口減社会へ

 総務省が四日、発表した住民基本台帳に基づく今年三月三十一日現在の人口動態によると、全国の人口は前年比三千五百五人減の一億二千七百五万五千二十五人で、一九六八年の調査以来、初めて減少に転じた。

ちょっと感慨深いニュース。

僕の親は人口を増やした最後の世代になるのかも。

あ、1968年以前増えてたってことは言ってないか。戦後は死人より生まれるほうが増えていたと思うけど。

まあ、確かなことは、ボク達は意思で人口を減らし始めた最初の世代ってことだ。