class CldrPlurals::RubyRuntime::StrNum

Attributes

exp[R]
frac[R]
int[R]
sign[R]

Public Class Methods

from_string(str) click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 5
def self.from_string(str)
  sign, int, frac, exp = str.scan(/([+-])?(\d+)\.?(\d+)?[eEcC]?(-?\d+)?/).flatten
  new(sign || '', int, frac || '', exp.to_i)
end
new(sign, int, frac, exp) click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 12
def initialize(sign, int, frac, exp)
  @sign = sign
  @int = int
  @frac = frac
  @exp = exp
end

Public Instance Methods

abs() click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 38
def abs
  self.class.new('', int, frac, exp)
end
apply_exp() click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 28
def apply_exp
  new_int, new_frac = if exp > 0
    shift_right(exp)
  else
    shift_left(exp.abs)
  end

  self.class.new(sign, new_int || '', new_frac || '', 0)
end
frac_val() click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 23
def frac_val
  # remove leading zeroes
  frac.sub(/\A0*/, '')
end
int_val() click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 19
def int_val
  int.to_i
end
strip() click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 50
def strip
  self.class.new(sign, int, frac.sub(/0+\z/, ''), exp)
end
to_s() click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 42
def to_s
  ''.tap do |result|
    result << "#{sign}#{int}"
    result << ".#{frac}" unless frac.empty?
    result << "e#{exp}" if exp != 0
  end
end
to_val() click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 54
def to_val
  str = to_s

  if str.include?('.')
    str.to_f
  else
    str.to_i * (10 ** exp)
  end
end

Private Instance Methods

shift_left(n) click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 81
def shift_left(n)
  return [int, frac] if exp == 0

  new_frac = ''

  if n - int.length > 0
    new_frac << '0' * (n - int.length)
  end

  new_frac << int[0...n]
  new_frac << frac
  new_int = int[n..-1]
  new_int = !new_int || new_int.empty? ? '0' : new_int

  [new_int, new_frac]
end
shift_right(n) click to toggle source
# File lib/cldr-plurals/ruby-runtime/str_num.rb, line 66
def shift_right(n)
  return [int, frac] if exp == 0

  new_int = "#{int}#{frac[0...n]}"

  if n - frac.length > 0
    new_int << '0' * (n - frac.length)
  end

  new_frac = frac[n..-1]
  new_frac = (!new_frac || new_frac.empty?) && !frac.empty? ? '0' : new_frac

  [new_int, new_frac]
end