class TwitterCldr::Formatters::Rbnf::NormalRuleFormatter

Attributes

is_fractional[R]
locale[R]
omit[R]
rule_group[R]
rule_set[R]

Public Class Methods

new(rule_set, rule_group, locale) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 55
def initialize(rule_set, rule_group, locale)
  @rule_set = rule_set
  @rule_group = rule_group
  @is_fractional = false
  @locale = locale
end

Public Instance Methods

close_bracket(number, rule, token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 112
def close_bracket(number, rule, token)
  @omit = false
  ""
end
decimal(number, rule, token) click to toggle source

if a decimal token occurs here, it's actually plaintext

# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 122
def decimal(number, rule, token)
  token.value
end
equals(number, rule, token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 80
def equals(number, rule, token)
  generate_replacement(number, rule, token)
end
format(number, rule) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 62
def format(number, rule)
  rule.tokens.map do |token|
    result = send(token.type, number, rule, token)
    @omit ? "" : result
  end.join
end
generate_replacement(number, rule, token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 84
def generate_replacement(number, rule, token)
  if rule_set_name = token.rule_set_reference
    RuleFormatter.format(
      number,
      rule_group.rule_set_for(rule_set_name),
      rule_group,
      locale
    )
  elsif decimal_format = token.decimal_format
    sign = number < 0 ? :negative : :positive
    @data_reader ||= TwitterCldr::DataReaders::NumberDataReader.new(locale)
    decimal_format = @data_reader.pattern_for_sign(decimal_format, sign)
    @decimal_tokenizer ||= TwitterCldr::Tokenizers::NumberTokenizer.new(@data_reader)
    decimal_tokens = @decimal_tokenizer.tokenize(decimal_format)
    @decimal_formatter ||= TwitterCldr::Formatters::NumberFormatter.new(@data_reader)
    @decimal_formatter.format(
      decimal_tokens, number, type: :decimal
    )
  else
    RuleFormatter.format(number, rule_set, rule_group, locale)
  end
end
left_arrow(number, rule, token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 75
def left_arrow(number, rule, token)
  quotient = (number.abs / rule.divisor) * (number < 0 ? -1 : 1)
  generate_replacement(quotient, rule, token)
end
open_bracket(number, rule, token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 107
def open_bracket(number, rule, token)
  @omit = rule.even_multiple_of?(number)
  ""
end
plaintext(number, rule, token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 117
def plaintext(number, rule, token)
  token.value
end
plural(number, rule, token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 130
def plural(number, rule, token)
  token.render(number / rule.divisor)
end
right_arrow(number, rule, token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 69
def right_arrow(number, rule, token)
  prev_rule = rule_set.previous_rule_for(rule) if token.length == 3
  remainder = (number.abs % rule.divisor) * (number < 0 ? -1 : 1)
  generate_replacement(remainder, prev_rule, token)
end
semicolon(number, rule, token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 126
def semicolon(number, rule, token)
  ""
end

Protected Instance Methods

fractional_part(number) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 140
def fractional_part(number)
  ".#{number.to_s.split(".")[1] || 0}".to_f
end
integral_part(number) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 144
def integral_part(number)
  number.to_s.split(".").first.to_i
end
invalid_token_error(token) click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 136
def invalid_token_error(token)
  InvalidRbnfTokenError.new("'#{token.value}' not allowed in negative number rules.")
end
transliterate?() click to toggle source
# File lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb, line 148
def transliterate?
  !SKIP_DECIMAL_TRANSLITERATION.include?(locale)
end