書籍検索をするとISBN13だけのものもあり、 ASINと同じISBN10を計算したいなと、
いろいろ調べたので、その時の備忘録。
はじめてみたけど、チェックディジットの簡単に計算できるのはびっくり!
ISBN13 → ISBN10
- 左3桁と右1桁目を取る
- 「モジュラス11 ウェイト10-2」という計算方法でISBN10チェックディジットを求める
X = n1*10 + n2*9 + n3*8 + n4*7 + n5*6 + n6*5 + n7*4 + n8*3 + n9*2 Z = X % 11 Digit = 11 - Z
- チェックディジットを右端に付与
TypeScriptで書くととこんな感じ。
/** * ISBN13 => ISBN10への変換 */ public convertTo10(isbn13: string): string { // 左3桁と末尾1桁を削除 const base: string = isbn13.slice(3, isbn13.length - 1); // チェックディジットの計算 const digitBase: number = Array.from(base) .map((v, i) => Number(v) * (10 - i)) .reduce((x, y) => x + y); const digit: number = 11 - (digitBase % 11); // チェックディジットを末尾に付与 => isbn10 return base + String(digit); }
ISBN10 → ISBN13
- 右1桁目を取る
- 接頭記号978を左端に付与
- 「モジュラス10 ウェイト3・1(モジュラス10 ウェイト3)」という計算法でISBN13チェックディジットを求める
X = n1*1 + n2*3 + n3*1 + n4*3 + n5*1 + n6*3 + n7*1 + n8*3 + n9*1 + n10*3 + n11*1 + n12*3 Z = X % 10 Digit = 10 - Z
- チェックディジットを右端に付与
※接頭記号978は国によって979になる場合がある(現行企画(概要) | ISBN | Wikipedia)
TypeScriptで書くととこんな感じ。
/** * ISBN10 => ISBN13への変換 */ public convertTo13(isbn10: string): string { // 978をつけて末尾1桁を削除 const base: string = "978" + isbn10.slice(0, isbn10.length - 1); // チェックディジットの計算 const digitBase: number = Array.from(base) .map((v, i) => (i % 2 == 0 ? Number(v) : Number(v) * 3)) .reduce((x, y) => x + y); const digit: number = 10 - (digitBase % 10); // チェックディジットを末尾に付与 => isbn13 return base + String(digit); }
ISBN → ASIN
ISBNとASINの関係はこんな感じ
- ASINはISBN10と等価
- なお、ISNB13はJANと等価
なので、変換処理としてはこんな感じでいいかも。
- ISBN10の場合は、そのまま
- ISBN13の場合は、ISBN10への変換処理をおこなう
※電子書籍とかは別。。
以上!!