module String::JnumToAnum

Constants

TRANSMANS
TRANSUNIT

Public Instance Methods

kansuji_to_num() click to toggle source
# File lib/jnum_to_anum.rb, line 6
def kansuji_to_num
  s = self.tr('一二三四五六七八九〇壱弐参0-9a-zA-Z','12345678901230-9a-zA-Z').gsub(/[,.]+/,"")
  exception = s.match(/^([0-9]+)(百万|千)\z/)
  if exception #例外  売り上げなどは1,700百万円などと表記することがある
    unit = exception[2] == "千" ? 1000 : 1000000
    return  exception[1].to_i * unit
  end
  partial_arr = []
  TRANSMANS.each do |key , value|
    index = s.index(key.to_s)
    next unless index
    partial_arr << s.slice(0..index-1)
    partial_arr << s[index]
    s = s.slice(index + 1..-1 )
  end
  partial_arr << s unless s.empty?
  filtered_arr = []
  partial_arr.each do |partial|
    unless partial =~ /十|百|千|拾/
      if partial =~ /兆|億|万/
        filtered_arr << filtered_arr.pop * TRANSMANS[partial.to_sym]
      else
        filtered_arr << partial.to_i
      end
      next
    end
    ar = []
    TRANSUNIT.each do |key,value|
      p_index = partial.index(key.to_s)
      next unless p_index
      ar << partial.slice(0..p_index)
      partial = partial.slice(p_index + 1..-1 )
    end
    ar << partial unless partial.empty?
    sum = 0
    ar.each do |wo|
      m_w = wo.match(/([0-9]+)([^0-9]+)/)
      if m_w
        return_num = m_w[1].to_i * TRANSUNIT[m_w[2].to_sym]
      elsif wo.match(/([0-9]+)/)
        return_num = wo.match(/([0-9]+)/)[1].to_i
      else
        return_num = TRANSUNIT[wo.match(/([^0-9]+)/)[1].to_sym]
      end
      sum += return_num
    end
    filtered_arr << sum
  end
  return_num = filtered_arr.inject {|sum, n| sum + n }
  return return_num
end