Wikipediaみて、ISBN 10->13変換のやり方を学んだ
# isbn? # 正しい13桁ISBN => そのまま返す # 正しい10桁ISBN => 13桁に変換して返す # それ以外 => false def isbn?(n) case n when /^\d{9}[\dX]$/ if chkdigit10(n) == n[-1,1] "978" + n[0,9] + chkdigit13("978" + n) else false end when /^\d{12}[\dX]$/ if chkdigit13(n) == n[-1,1] n else false end else return false end end def chkdigit10(isbn) n = 10 a = 0 isbn[0,9].each_byte do |i| a += (i-48) * n n -= 1 end a = 11 - a % 11 a == 10 ? "X" : a.to_s end def chkdigit13(isbn) n = 1 a = 0 isbn[0,12].each_byte do |i| a += (i-48) * n n = (n == 1 ? 3 : 1) end a = 10 - a % 10 a == 10 ? "0" : a.to_s end