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