class TaiwanValidator::UbnValidator

Constants

MULTIPLIER

Public Class Methods

valid?(ubn) click to toggle source
# File lib/taiwan_validator/ubn_validator.rb, line 5
def valid?(ubn)
  ubn = ubn.to_s
  return false unless ubn.match?(/\A\d{8}\z/)

  digits = ubn.chars.map(&:to_i)
  results = digits.zip(MULTIPLIER).map do |op1, op2|
    digit = op1 * op2
    digit = digit.to_s.chars.map(&:to_i).reduce(&:+) if number_digits(digit) == 2
    digit
  end.inject(&:+)

  results % 10 == 0 || (ubn[6] == "7" && (results + 1) % 10 == 0)
end

Private Class Methods

number_digits(number) click to toggle source
# File lib/taiwan_validator/ubn_validator.rb, line 21
def number_digits(number)
  number.zero? ? 1 : Math.log10(number).to_i + 1
end

Public Instance Methods

validate_each(record, attribute, value) click to toggle source
# File lib/taiwan_validator/ubn_validator.rb, line 26
def validate_each(record, attribute, value)
  unless self.class.valid?(value)
    record.errors.add(attribute, options[:message] || :invalid)
  end
end