class Tsubaki::MyNumber

Public Class Methods

calc_check_digit(digits) click to toggle source
# File lib/tsubaki/my_number.rb, line 9
def self.calc_check_digit(digits)
  fail 'must be a 11 digit number' unless digits =~ /\A\d{11}\z/

  arr = digits.chars.map(&:to_i).reverse!
  rem = (1..11).inject(0) do |sum, n|
    pn = arr[n - 1]
    qn = (n <= 6) ? (n + 1) : (n - 5)
    sum + pn * qn
  end % 11

  rem <= 1 ? 0 : (11 - rem)
end
new(digits, options = {}) click to toggle source
# File lib/tsubaki/my_number.rb, line 22
def initialize(digits, options = {})
  @digits = digits.to_s.freeze
  @options = options
end
rand() click to toggle source
# File lib/tsubaki/my_number.rb, line 3
def self.rand
  digits = 11.times.map { Kernel.rand(10) }.join
  check_digit = calc_check_digit(digits)
  "#{digits}#{check_digit}"
end

Public Instance Methods

valid?() click to toggle source
# File lib/tsubaki/my_number.rb, line 27
def valid?
  @options[:strict] ? valid_check_digit? : valid_pattern?
end
valid_check_digit?() click to toggle source
# File lib/tsubaki/my_number.rb, line 35
def valid_check_digit?
  return false unless valid_pattern?
  plain_digits[-1].to_i == self.class.calc_check_digit(plain_digits[0, 11]).to_i
end
valid_pattern?() click to toggle source
# File lib/tsubaki/my_number.rb, line 31
def valid_pattern?
  !!(plain_digits =~ /\A\d{12}\z/)
end

Private Instance Methods

plain_digits() click to toggle source
# File lib/tsubaki/my_number.rb, line 42
def plain_digits
  @plain_digits ||= @digits.split(@options[:divider]).join('')
end