ISBN10とISBN13を相互に変換するRubyプログラム

ISBN10とISBN13を相互に変換するRubyプログラム

# ISBN10をISBN13に変換する
def isbn10_to_13(isbn10)
  isbn13 = "978#{isbn10[0..8]}"
  #チェックデジット計算用
  check_digit = 0
  isbn13.split(//).each_with_index do |chr, idx|
    #Integer#even?はActiveSupportによる拡張
    check_digit += chr.to_i * (idx.even? ? 1 : 3)
  end
  #総和を10で割ったものを10から引き、10の場合は0にする
  check_digit = (10 - (check_digit % 10)) % 10
  return "#{isbn13}#{check_digit}"
end

# ISBN13をISBN10に変換する
def isbn13_to_10(isbn13)
  isbn10 = isbn13[3..11]
  check_digit = 0
  isbn10.split(//).each_with_index do |chr, idx|
    check_digit += chr.to_i * (10 - idx)
  end
  check_digit = 11 - (check_digit % 11)
  #計算結果が 10 になった場合、10 の代わりに X(アルファベットの大文字)を用いる。
  #また、11 になった場合は、0 となる。
  case check_digit
  when 10: check_digit = "X"
  when 11: check_digit = 0
  end
  return "#{isbn10}#{check_digit}"
end

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください