class GS1::CheckDigitCalculator

GS1 check digit calculation

Implementation of: www.gs1.org/how-calculate-check-digit-manually Notice! This class does not validate the format of the given sequence, only the length.

Constants

MULTIPLIER_ARRAY
VALID_LENGTHS

Attributes

reverse_sequence[R]
sequence[R]

Public Class Methods

from_sequence(sequence) click to toggle source
# File lib/gs1/check_digit_calculator.rb, line 19
def self.from_sequence(sequence)
  new(sequence).check_digit
end
new(sequence) click to toggle source
# File lib/gs1/check_digit_calculator.rb, line 12
def initialize(sequence)
  @sequence = sequence
  @reverse_sequence = sequence.chars.reverse

  raise ArgumentError, 'Invalid length' unless VALID_LENGTHS.include?(sequence.size)
end
with_sequence(sequence) click to toggle source
# File lib/gs1/check_digit_calculator.rb, line 23
def self.with_sequence(sequence)
  new(sequence).calculate_sequence_with_digit
end

Public Instance Methods

calculate_sequence_with_digit() click to toggle source
# File lib/gs1/check_digit_calculator.rb, line 31
def calculate_sequence_with_digit
  sequence + check_digit
end
check_digit() click to toggle source
# File lib/gs1/check_digit_calculator.rb, line 27
def check_digit
  sub_from_nearest_higher_ten.to_s
end

Private Instance Methods

multiplied_sequence() click to toggle source
# File lib/gs1/check_digit_calculator.rb, line 39
def multiplied_sequence
  @multiplied_sequence ||= reverse_sequence.each_with_index.map do |digit, idx|
    digit.to_i * MULTIPLIER_ARRAY[idx]
  end
end
sub_from_nearest_higher_ten() click to toggle source
# File lib/gs1/check_digit_calculator.rb, line 45
def sub_from_nearest_higher_ten
  (10 - (multiplied_sequence.inject(:+) % 10)) % 10
end