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