ISBN-13 と ISBN-10
ISBN は書籍の識別用に設けられている国際規格のコードです。ISBN には10桁の旧規格(ISBN-10)と13桁の現行規格(ISBN-13)があります。
2007年以降 ISBN-10 は新たに発番されておらず、新刊書には ISBN-13 が必ず発番されるようになっています。
基本的に ISBN-13 が新しい規格なのでこちらを使用するべきですが、Amazon では旧規格の ISBN-10 を使って商品ページにアクセスでるリンクが作れます。なので変換ができると便利な場面があります。
https://www.amazon.co.jp/dp/{ISBN-10}
上のようなリンクで書籍の販売ページにアクセスできます。
ISBN-13 を ISBN-10 に変換する
ISBN-13 の先頭3桁は接頭記号(978)で、末尾1桁はチェックデジットです。それ以外のあいだ9桁が ISBN-10 のデータに対応します。ISBN-10 も末尾1桁がチェックデジットになります。
したがって ISBN-13 の4桁目から12桁目までの9桁に、その9桁のを使って計算したチェックデジットを付け足した10桁が ISBN-10 になります。
チェックデジットの計算は 上位の桁から10,9,8..2を掛けてそれらの和を取り、11で割って出た余りを11から引く という計算で求まります。
では 9784915512377 という ISBN-13 を例として ISBN-10 に変換してみます。ちなみに ハリー・ポッターと賢者の石 の ISBN-13 です。
Javascriptで変換関数を実装
ISBN-13 を ISBN-10 に変換する関数を Javascript で実装します。
function convertToIsbn10(isbn13) {
const sum = isbn13.split('').slice(3, 12).reduce((acc, c, i) => {
return acc + (c[0] - '0') * (10 - i);
}, 0);
const checkDigit = 11 - sum % 11;
const isbn10 = isbn13.substring(3, 12) + checkDigit.toString();
return isbn10;
}
const isbn10 = convertToIsbn10('9784915512377');
console.log(isbn10); // 4915512371
slice(3, 12)
で3桁目から12桁目までの9桁を reduce()
を使って計算した和を求めます。c[0] - '0'
の部分は文字を整数値に変換しています。
最終的に求めた和を11で割った余りを11から引いてチェックデジットを求まります。
最終的に3桁目から12桁目までの9桁の後ろに求めたチェックデジットを付け足して ISBN-10 になります。
Amazon の商品ページの登録情報に ISBN-13 と ISBN-10 が載っているので確認に使えます。
こんな感じです。
以上。
はじめまして、情報共有ありがとうございます。
ただ、チェックデジットが10、11の時に、ISBN-10が11桁になってます。
チェックデジットが、10の時はXで11の時は0にする必要がありますよ。