Module: Petrarca::ISBN13

Extended by:
ISBN13
Included in:
ISBN13
Defined in:
lib/petrarca/isbn13.rb

Instance Method Summary collapse

Instance Method Details

#calc_check_digit(isbn) ⇒ Object



18
19
20
21
22
23
# File 'lib/petrarca/isbn13.rb', line 18

def calc_check_digit(isbn)
  nums = isbn.delete("-").split("")[0, 12].map{|x| x.to_i }
  sum = nums.zip([1, 3] * 6).map{|x, y| x * y }.inject(:+)
  check_digit = 10 - (sum % 10)
  check_digit == 10 ? "0" : check_digit.to_s
end

#correct_format?(isbn) ⇒ Boolean

Returns:

  • (Boolean)


13
14
15
16
# File 'lib/petrarca/isbn13.rb', line 13

def correct_format?(isbn)
  isbn = isbn.delete("-")
  !!(/\A97[89]\d{9}\d\z/ =~ isbn)
end

#hyphenate(isbn) ⇒ Object



25
26
27
28
29
30
31
32
33
# File 'lib/petrarca/isbn13.rb', line 25

def hyphenate(isbn)
  ean_prefix = isbn[0, 3]
  body = isbn[3, 9]
  check_digit = isbn[12, 1]
  registration_group, body = Helpers.split_to_parts(body, REGISTRATION_GROUP_RANGES[ean_prefix])
  prefix = "#{ean_prefix}-#{registration_group}"
  registrant, publication = Helpers.split_to_parts(body, REGISTRANT_RANGES[prefix])
  [ean_prefix, registration_group, registrant, publication, check_digit].join("-")
end

#valid?(isbn) ⇒ Boolean

Returns:

  • (Boolean)


9
10
11
# File 'lib/petrarca/isbn13.rb', line 9

def valid?(isbn)
  correct_format?(isbn) && isbn[-1] == calc_check_digit(isbn)
end