module Sjekksum::ISBN10

Module for calculation and validation of ISBN-10 (International Standard Book Number) checksums

@see en.wikipedia.org/wiki/International_Standard_Book_Number#ISBN-10_check_digit_calculation ISBN-10 check digit calculation

Public Instance Methods

checksum(number)
Alias for: of
convert(number) click to toggle source

Transforms a number by appending the ISBN-10 checksum digit

@example

Sjekksum::ISBN10.convert("147743025") #=> "1477430253"
Sjekksum::ISBN10.convert("193435600") #=> "193435600X"

@param number [Integer, String] number without a checksum

@return [Integer, String] final number including the checksum

# File lib/sjekksum/isbn10.rb, line 61
def convert number
  raise_on_type_mismatch number
  check = self.of(number)
  if number.is_a?(String) or check.is_a?(String)
    number.to_s << self.of(number).to_s
  else
    convert_to_int(number) * 10 + self.of(number)
  end
end
Also aliased as: transform
is_valid?(number)
Alias for: valid?
of(number) click to toggle source

Calculates ISBN-10 checksum

@example

Sjekksum::ISBN10.of("147743025") #=> 3
Sjekksum::ISBN10.of("193435600") #=> "X"

@param number [Integer, String] number for which the checksum should be calculated

@return [Integer, String] calculated checksum

# File lib/sjekksum/isbn10.rb, line 21
def of number
  raise_on_type_mismatch number
  digits = convert_number_to_digits(number)[0..9]

  sum    = digits.reverse_each.with_index.reduce(0) do |check, (digit, idx)|
    check += digit * (idx+2)
  end

  check = (11 - sum % 11) % 11
  check == 10 ? "X" : check
end
Also aliased as: checksum
transform(number)
Alias for: convert
valid?(number) click to toggle source

ISBN-10 validation of provided number

@example

Sjekksum::ISBN10.valid?("1477430253") #=> true
Sjekksum::ISBN10.valid?("193435600X") #=> true

@param number [Integer, String] number with included checksum

@return [Boolean]

# File lib/sjekksum/isbn10.rb, line 44
def valid? number
  raise_on_type_mismatch number
  num, check = split_isbn_number(number)
  convert_number_to_digits(num).length == 9 && self.of(num) == check
end
Also aliased as: is_valid?

Private Instance Methods

split_isbn_number(number) click to toggle source
split_isbn_number description

@param number [type] [description]

@return [type] [description]

# File lib/sjekksum/isbn10.rb, line 79
def split_isbn_number number
  if number.is_a?(String)
    [ number[0..-2], (%w[X x].include?(number[-1]) ? "X" : number[-1].to_i) ]
  else
    number.divmod(10)
  end
end