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