Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

isbn?メソッドの実装

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