class TwitterCldr::DataReaders::NumberDataReader

Constants

ABBREVIATED_MAX_POWER
ABBREVIATED_MIN_POWER
DEFAULT_FORMAT
DEFAULT_NUMBER_SYSTEM
DEFAULT_SIGN
DEFAULT_TYPE
FORMATS
FORMATTERS
NUMBER_MAX
NUMBER_MIN
PATTERN_PATH
PluralRules
SYMBOL_PATH
TYPES

Attributes

format[R]
number_system[R]
type[R]

Public Class Methods

new(locale, options = {}) click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 41
def initialize(locale, options = {})
  super(locale)
  @type = options[:type] || DEFAULT_TYPE

  unless type && TYPES.include?(type.to_sym)
    raise ArgumentError.new("Type #{type} is not supported")
  end

  @format = options[:format] || DEFAULT_FORMAT
  @number_system = options[:number_system] || default_number_system
end
types() click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 37
def self.types
  TYPES
end

Private Class Methods

within_abbreviation_range?(number) click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 147
def self.within_abbreviation_range?(number)
  abs_value = number.abs
  NUMBER_MIN <= abs_value && abs_value < NUMBER_MAX
end

Public Instance Methods

default_number_system() click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 95
def default_number_system
  @default_number_system ||= resource[:numbers][:default_number_systems][:default].to_sym
end
format_number(number, options = {}) click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 53
def format_number(number, options = {})
  precision = options[:precision] || 0
  pattern_for_number = pattern(number, precision == 0)
  options[:locale] = self.locale
  tokens = tokenizer.tokenize(pattern_for_number)
  formatter.format(tokens, number, options)
end
formatter() click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 91
def formatter
  @formatter ||= FORMATTERS[type].new(self)
end
pattern(number, decimal = true) click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 61
def pattern(number, decimal = true)
  zeroes = number.to_i.abs.to_s.size - 1
  magnitude = "1#{'0' * zeroes}"
  truncated_num = formatter.truncate_number(number, zeroes % 3 + 1)
  truncated_num = truncated_num.to_i if decimal
  plural_rule = PluralRules.rule_for(truncated_num, locale)

  path = PATTERN_PATH + [
    type,
    number_system,
    [format, :default],
    magnitude.to_sym,
    [plural_rule, :other]
  ]

  sign = number < 0 ? :negative : :positive

  pattern_for_sign(
    traverse_finding_best_fit(path, []), sign
  )
end
pattern_for_sign(pattern, sign) click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 99
def pattern_for_sign(pattern, sign)
  if pattern.include?(";")
    positive, negative = pattern.split(";")
    sign == :positive ? positive : negative
  else
    case sign
      when :negative
        "#{symbols[:minus_sign] || '-'}#{pattern}"
      else
        pattern
    end
  end
end
symbols() click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 83
def symbols
  @symbols ||= traverse_following_aliases(SYMBOL_PATH + [number_system])
end
tokenizer() click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 87
def tokenizer
  @tokenizer ||= TwitterCldr::Tokenizers::NumberTokenizer.new(self)
end

Private Instance Methods

resource() click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 140
def resource
  @resource ||= begin
    raw = TwitterCldr.get_locale_resource(locale, :numbers)
    raw[TwitterCldr.convert_locale(locale)]
  end
end
traverse_finding_best_fit(path_pattern, path, hash = resource) click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 115
def traverse_finding_best_fit(path_pattern, path, hash = resource)
  if path_pattern.empty?
    result = traverse_following_aliases(path, hash)
    return result if result.is_a?(String)
  else
    Array(path_pattern.first).each do |leg|
      result = traverse_finding_best_fit(path_pattern[1..-1], path + [leg], hash)
      return result if result
    end

    result = traverse_following_aliases(path, hash)
    return result if result.is_a?(String)
  end
end
traverse_following_aliases(path, hash = resource) click to toggle source
# File lib/twitter_cldr/data_readers/number_data_reader.rb, line 130
def traverse_following_aliases(path, hash = resource)
  traverse(path, hash) do |_leg, leg_data|
    if leg_data.is_a?(Symbol) && leg_data.to_s.start_with?('numbers.')
      traverse_following_aliases(leg_data.to_s.split('.').map(&:to_sym))
    else
      leg_data
    end
  end
end