Class: Numerals::Format::Symbols::Digits

Inherits:
Numerals::FormattingAspect show all
Includes:
ModalSupport::StateEquivalent
Defined in:
lib/numerals/format/symbols.rb

Constant Summary collapse

DEFAULT_DIGITS =
%w(0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Numerals::FormattingAspect

#[], [], aspect, #set, set

Constructor Details

#initialize(*args) ⇒ Digits

Returns a new instance of Digits.



18
19
20
21
22
23
24
25
26
# File 'lib/numerals/format/symbols.rb', line 18

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

Instance Attribute Details

#case_sensitiveObject

Returns the value of attribute case_sensitive.



37
38
39
# File 'lib/numerals/format/symbols.rb', line 37

def case_sensitive
  @case_sensitive
end

#digits_stringObject (readonly)

Returns the value of attribute digits_string.



37
38
39
# File 'lib/numerals/format/symbols.rb', line 37

def digits_string
  @digits_string
end

#lowercaseObject

Returns the value of attribute lowercase.



37
38
39
# File 'lib/numerals/format/symbols.rb', line 37

def lowercase
  @lowercase
end

#max_baseObject (readonly)

Returns the value of attribute max_base.



37
38
39
# File 'lib/numerals/format/symbols.rb', line 37

def max_base
  @max_base
end

#uppercaseObject

Returns the value of attribute uppercase.



37
38
39
# File 'lib/numerals/format/symbols.rb', line 37

def uppercase
  @uppercase
end

Instance Method Details

#case_sensitive?Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/numerals/format/symbols.rb', line 74

def case_sensitive?
  case_sensitive
end

#digit_symbol(v, options = {}) ⇒ Object



93
94
95
96
97
# File 'lib/numerals/format/symbols.rb', line 93

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) ⇒ Object



85
86
87
88
89
90
91
# File 'lib/numerals/format/symbols.rb', line 85

def digit_value(digit)
  if @case_sensitive
    @digits.index(digit)
  else
    @downcase_digits.index(digit.downcase)
  end
end

#digits(options = {}) ⇒ Object



40
41
42
43
44
45
46
47
# File 'lib/numerals/format/symbols.rb', line 40

def digits(options = {})
  base = options[:base] || @max_base
  if base >= @max_base
    @digits
  else
    @digits[0, base]
  end
end

#digits=(digits) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/numerals/format/symbols.rb', line 49

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 = {}) ⇒ Object

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



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/numerals/format/symbols.rb', line 102

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

#dupObject



140
141
142
# File 'lib/numerals/format/symbols.rb', line 140

def dup
  Digits[parameters]
end

#inspectObject



136
137
138
# File 'lib/numerals/format/symbols.rb', line 136

def inspect
  "Format::Symbols::#{self}"
end

#is_digit?(digit_symbol, options = {}) ⇒ Boolean

Returns:

  • (Boolean)


78
79
80
81
82
83
# File 'lib/numerals/format/symbols.rb', line 78

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

#parametersObject



122
123
124
125
126
127
128
129
# File 'lib/numerals/format/symbols.rb', line 122

def parameters
  params = {}
  params[:digits] = @digits
  params[:case_sensitive] = @case_sensitive
  params[:uppercase] = @uppercase
  params[:lowercase] = @lowercase
  params
end

#to_sObject



131
132
133
134
# File 'lib/numerals/format/symbols.rb', line 131

def to_s
  # TODO: show only non-defaults
  "Digits[#{parameters.inspect.unwrap('{}')}]"
end