class Numerals::Format::Symbols::Digits

Constants

DEFAULT_DIGITS

Attributes

case_sensitive[RW]
digits_string[R]
lowercase[R]
max_base[R]
uppercase[R]

Public Class Methods

new(*args) click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 7
def initialize(*args)
  @digits = DEFAULT_DIGITS
  @downcase_digits = @digits.map(&:downcase)
  @max_base = @digits.size
  @case_sensitive = false
  @uppercase = false
  @lowercase = false
  set! *args
end

Public Instance Methods

case_sensitive?() click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 63
def case_sensitive?
  case_sensitive
end
digit_symbol(v, options={}) click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 82
def digit_symbol(v, options={})
  base = options[:base] || @max_base
  raise "Invalid base" if base > @max_base
  v >= 0 && v < base ? @digits[v] : nil
end
digit_value(digit) click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 74
def digit_value(digit)
  if @case_sensitive
    @digits.index(digit)
  else
    @downcase_digits.index(digit.downcase)
  end
end
digits(options = {}) click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 29
def digits(options = {})
  base = options[:base] || @max_base
  if base >= @max_base
    @digits
  else
    @digits[0, base]
  end
end
digits=(digits) click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 38
def digits=(digits)
  if digits.is_a?(String)
    @digits = digits.each_char.to_a
  else
    @digits = digits
  end
  @max_base = @digits.size
  @lowercase = @digits.all? { |d| d.downcase == d }
  @uppercase = @digits.all? { |d| d.upcase == d }
  @downcase_digits = @digits.map(&:downcase)
  if @digits.uniq.size != @max_base
    raise "Inconsistent digits"
  end
end
digits_text(digit_values, options={}) click to toggle source

Convert sequence of digits to its text representation. The nil value can be used in the digits sequence to represent the group separator.

# File lib/numerals/format/symbols/digits.rb, line 91
def digits_text(digit_values, options={})
  insignificant_digits = options[:insignificant_digits] || 0
  num_digits = digit_values.reduce(0) { |num, digit|
    digit.nil? ? num : num + 1
  }
  num_digits -= insignificant_digits
  digit_values.map { |d|
    if d.nil?
      options[:separator]
    else
      num_digits -= 1
      if num_digits >= 0
        digit_symbol(d, options)
      else
        options[:insignificant_symbol]
      end
    end
  }.join
end
dup() click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 145
def dup
  Format::Symbols::Digits[parameters]
end
inspect() click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 141
def inspect
  "Format::Symbols::#{self}"
end
is_digit?(digit_symbol, options={}) click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 67
def is_digit?(digit_symbol, options={})
  base = options[:base] || @max_base
  raise "Invalid base" if base > @max_base
  v = digit_value(digit_symbol)
  v && v < base
end
lowercase=(v) click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 58
def lowercase=(v)
  @lowercase = v
  self.digits = @digits.map(&:downcase) if v
end
parameters() click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 111
def parameters
  params = {}
  params[:digits] = @digits
  params[:case_sensitive] = @case_sensitive
  params[:uppercase] = @uppercase
  params[:lowercase] = @lowercase
  params
end
to_s() click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 120
def to_s
  # TODO: show only non-defaults
  args = []
  if @digits != DEFAULT_DIGITS
    args << @digits.to_s
  end
  if @max_base != @digits.size
    args << "max_base: #{@max_base}"
  end
  if @case_sensitive
    args << "case_sensitive: #{case_sensitive.inspect}"
  end
  if @uppercase
    args << "uppercase: #{uppercase.inspect}"
  end
  if @lowercase
    args << "lowercase: #{lowercase.inspect}"
  end
  "Digits[#{args.join(', ')}]"
end
uppercase=(v) click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 53
def uppercase=(v)
  @uppercase = v
  self.digits = @digits.map(&:upcase) if v
end

Private Instance Methods

extract_options(*args) click to toggle source
# File lib/numerals/format/symbols/digits.rb, line 151
def extract_options(*args)
  options = {}
  args = args.first if args.size == 1 && args.first.kind_of?(Array)
  args.each do |arg|
    case arg
    when Hash
      options.merge! arg
    when String, Array
      options[:digits] = arg
    when Format::Symbols::Digits
      options.merge! arg.parameters
    when :uppercase, :downcase
      send :"#{arg}=", true
    else
      raise "Invalid Symbols::Digits definition"
    end
  end
  options
end