class Bookland::ASIN
Constants
- WEIGHTS
Public Class Methods
calculate_checksum_digit(digits)
click to toggle source
# File lib/bookland/asin.rb, line 5 def self.calculate_checksum_digit(digits) sum = digits.map(&:to_i).zip(WEIGHTS).reduce(0) { |a , (i, j)| a + i * j } case checksum_digit = 11 - sum % 11 when 0..9 then checksum_digit.to_s when 10 then 'X' when 11 then '0' end end
from_isbn(isbn)
click to toggle source
# File lib/bookland/asin.rb, line 15 def self.from_isbn(isbn) data_digits = isbn.split('')[3..11] checksum_digit = ASIN.calculate_checksum_digit(data_digits) (data_digits << checksum_digit).join end
to_isbn(asin)
click to toggle source
# File lib/bookland/asin.rb, line 22 def self.to_isbn(asin) return if asin[0] == 'B' data_digits = %w(9 7 8) + asin.split('')[0, 9] checksum_digit = ISBN.calculate_checksum_digit(data_digits) (data_digits << checksum_digit).join end
Public Instance Methods
valid?()
click to toggle source
Calls superclass method
# File lib/bookland/asin.rb, line 31 def valid? case digits.first when 'B' digits.size == 10 else digits.size == 10 && super end end