くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

ISBN13からISNB10/ASINを計算する (TypeScript ver.)

書籍検索をするとISBN13だけのものもあり、 ASINと同じISBN10を計算したいなと、
いろいろ調べたので、その時の備忘録。
はじめてみたけど、チェックディジットの簡単に計算できるのはびっくり!

ISBN13 → ISBN10

  1. 左3桁と右1桁目を取る
  2. 「モジュラス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
  1. チェックディジットを右端に付与
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. 右1桁目を取る
  2. 接頭記号978を左端に付与
  3. 「モジュラス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
  1. チェックディジットを右端に付与

※接頭記号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と等価

なので、変換処理としてはこんな感じでいいかも。

  1. ISBN10の場合は、そのまま
  2. ISBN13の場合は、ISBN10への変換処理をおこなう

電子書籍とかは別。。

以上!!

参考にしたサイト様