ISBN規格改訂

1月1日からISBN(国際標準図書番号)が変わったという話題。

via ぷわぷわのあかしろ - ISBN
cf. 日本図書コード管理センター - ISBN規格改訂のお知らせ

そういえば昨日買った本のISBNは13桁だった。
そうか,チェックデジットの計算方法も変わってるのか。


で,旧番号から新番号に変換するコードを書いてみた。
入力は,頭の "ISBN" やチェックデジットはあってもなくても良いけど,区切りの "-" は必須。

 module Main (main) where
 
 import Data.Char (isAlpha, isDigit)
 import System (getArgs)
 
 
 checkDigit :: [Char] -> String
 checkDigit s = show cd
   where
     cd = if l == 0  then 0  else 10 - l
     l = f `mod` 10
     f = sum $ zipWith (*) [1,3,1,3,1,3,1,3,1,3,1,3] $ map (\c -> read [c]) s
 
 
 stripIsbnOld :: String -> String
 stripIsbnOld = take 11 . dropWhile isAlpha
 
 
 isbnConv :: String -> String -> String
 isbnConv flg old = "ISBN" ++ flg ++ stripIsbnOld old  ++ "-" ++  checkDigit (filter isDigit (flg ++  old))
 
 
 isbnConv978 :: String -> String
 isbnConv978 = isbnConv "978-"
 
 
 
 main :: IO ()
 main = do cs <- getArgs >>= return . head
           putStr $ isbnConv978 cs

実行例。

 D:\>runghc isbnconv.hs ISBN4-949999-08-7
 ISBN978-4-949999-08-3