class Numeja::Number

Number class @class private @since 0.0.2

Public Class Methods

new(str) click to toggle source
Calls superclass method
# File lib/numeja/number.rb, line 6
def initialize(str)
  @str = str
  super(parse)
end

Private Instance Methods

nomarize(str) click to toggle source

Return nomarized Kansuuji

@return [::String]

@api private @since 0.0.1

# File lib/numeja/number.rb, line 54
def nomarize(str)
  str
    .tr('0-9', '0-9')
    .gsub(REGEXP_旧字, JA_大字)
    .gsub(REGEXP_数字, JA_数字)
end
parse() click to toggle source
# File lib/numeja/number.rb, line 13
def parse
  nomarized = nomarize(@str)
  units = parse_large_numbers(nomarized)
  @result = units.reduce(0) do |t, unit|
    large_prefix = JA_上数[unit[:digit]]
    if large_prefix.nil?
      integer_part, decimal_part = split_digit(unit[:unit])
      int = integer_part.nil? ? 0 : parse_integer_part(integer_part)
      decimal = decimal_part.nil? ? 0 : parse_decimal_part(decimal_part)
      t += int + decimal
    else
      integer = parse_integer_part(unit[:unit])
      t += integer * large_prefix
    end
    t
  end
end
parse_decimal_part(str) click to toggle source

Return parsed decimal part

@return [Integer, Float]

@api private @since 0.0.1

# File lib/numeja/number.rb, line 92
def parse_decimal_part(str)
  map = if str.index('割')
          Numeja::JA_割合用小数
        else
          Numeja::JA_小数
        end
  keys = map.keys()
  keys.reduce(0) do |t, ja_digit|
    index = str.index(ja_digit)
    break t if index.nil?
    unit = str.slice!(0, index)
    str.slice!(0, 1)
    t += (unit.to_f * map[ja_digit])
    t
  end
end
parse_integer_part(input) click to toggle source

Return nomarized Kansuuji

@return [::String]

@api private @since 0.0.1

# File lib/numeja/number.rb, line 67
def parse_integer_part(input)
  total = 0
  tmp = 0
  return input.to_i if input =~ /^[0-9]+$/
  input.gsub(REGEXP_数字, JA_数字).each_char do |s|
    unit_prefix = JA_下数[s]
    unless unit_prefix.nil?
      if tmp > 0
        total += tmp * unit_prefix
        tmp = 0
      else
        total += unit_prefix
      end
    end
    tmp += s.to_i
  end
  total + tmp
end
parse_large_numbers(str) click to toggle source

Return large number parts

@return [::Hash]

@api private @since 0.0.1

# File lib/numeja/number.rb, line 115
def parse_large_numbers(str)
  # (?<year>(.*)億)(?<oku>(.*)万)
  splited = Numeja::JA_上数.keys.reverse.map do |ja_digit|
    index = str.index(ja_digit)
    next if index.nil?
    unit = str.slice!(0, index)
    digit = str.slice!(0, 1)
    {
      digit: digit,
      unit: unit
    }
  end
  splited.push(
    digit: '',
    unit: str
  ).compact
end
split_digit(str) click to toggle source

Return numerals parts

@return [Array<String>]

@api private @since 0.0.1

# File lib/numeja/number.rb, line 37
def split_digit(str)
  i = str.index(/.分|.割/)
  if i.nil?
    [str]
  elsif i.zero?
    [nil, str]
  else
    [str[0..i - 1], str[i..-1]]
  end
end