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