Module: Luhn::Validator

Defined in:
lib/luhn/validator.rb,
lib/luhn/validator/version.rb

Constant Summary collapse

VERSION =
'0.1.0'.freeze

Class Method Summary collapse

Class Method Details

.checksum(number) ⇒ Object



5
6
7
8
9
10
11
# File 'lib/luhn/validator.rb', line 5

def self.checksum(number)
  number = number.to_s.delete('-')
  products = luhn_doubled(number)
  sum = products.inject(0) { |t, p| t + sum_of(p) }
  checksum = 10 - (sum % 10)
  checksum == 10 ? 0 : checksum
end

.luhn_doubled(number) ⇒ Object



13
14
15
16
17
18
19
# File 'lib/luhn/validator.rb', line 13

def self.luhn_doubled(number)
  number = number.to_s.delete('-')
  numbers = split_digits(number).reverse
  numbers.map.with_index do |n, i|
    i.even? ? n * 2 : n * 1
  end.reverse
end

.split_digits(number) ⇒ Object



32
33
34
35
# File 'lib/luhn/validator.rb', line 32

def self.split_digits(number)
  number = number.to_s.delete('-')
  number.to_s.split(//).map(&:to_i)
end

.sum_of(number) ⇒ Object



21
22
23
24
# File 'lib/luhn/validator.rb', line 21

def self.sum_of(number)
  number = number.to_s.delete('-')
  split_digits(number).inject(:+)
end

.valid?(number) ⇒ Boolean

Returns:

  • (Boolean)


26
27
28
29
30
# File 'lib/luhn/validator.rb', line 26

def self.valid?(number)
  number = number.to_s.delete('-')
  numbers = split_digits(number)
  numbers.pop == checksum(numbers.join)
end