Sha256: cfca5844d773524aad620048b0048bc2e2af5b4640fe55f11e698cd74cf2010a

Contents?: true

Size: 850 Bytes

Versions: 4

Compression:

Stored size: 850 Bytes

Contents

class UbnValidator < ActiveModel::EachValidator
  MULTIPLIER = [1,2,1,2,1,2,4,1].freeze

  class << self
    def valid?(ubn)
      ubn = ubn.to_s
      return false if ubn.size != 8 || (ubn =~ /\A\d+\Z/).nil?

      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 = digit.to_s.chars.last.to_i if number_digits(digit) == 2
        digit
      end.inject(&:+)

      results % 10 == 0 ? true : false
    end

    private

    def number_digits(number)
      number.zero? ? 1 : Math.log10(number).to_i + 1
    end
  end

  def validate_each(record, attribute, value)
    unless self.class.valid?(value)
      record.errors.add(attribute, options[:message] || :invalid)
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
taiwan_validator-1.3.0 lib/ubn_validator.rb
taiwan_validator-1.2.0 lib/ubn_validator.rb
taiwan_validator-1.1.0 lib/ubn_validator.rb
taiwan_validator-1.0.0 lib/ubn_validator.rb