漢数字→数値変換メソッド

P230 - "七千百二十三"といった、漢数字による数の表現を「7123」のような数値に変換するメソッドkan2numを定義してみよう - krystal: プログラミング超初心者(文系) - Rubyist

とりあえず1〜9999対応。

# -*- coding: euc-jp -*-
KANNUM_1_9 = { ''=>1, ''=>1, ''=>2, ''=>3, ''=>4, ''=>5, ''=>6, ''=>7, ''=>8, ''=>9 }
def kan2num(kan)
  # _1000→●千 __1000→●
  _1000, __1000, _100, __100, _10, __10, __1 = kan.match(/\A((.*))?((.*))?((.*))?(.*)\z/).captures
  ret = __1 == '' ? 0 : KANNUM_1_9[__1]
  ret += KANNUM_1_9[__10]   * 10   if _10
  ret += KANNUM_1_9[__100]  * 100  if _100
  ret += KANNUM_1_9[__1000] * 1000 if _1000
  ret
end

kan2num("三千百六十八")   # => 3168
kan2num("千四百七十一")   # => 1471
kan2num("九千五百十二")   # => 9512
kan2num "二千三百四十三"  # => 2343
kan2num "二千三"          # => 2003
kan2num "十三"            # => 13
kan2num "五百"            # => 500
kan2num "五百十三"        # => 513
kan2num "千三百"          # => 1300
kan2num ""              # => 1000


こっちのがいいか。

# -*- coding: euc-jp -*-
KANNUM_1_9 = { ''=>1, ''=>1, ''=>2, ''=>3, ''=>4, ''=>5, ''=>6, ''=>7, ''=>8, ''=>9 }
KANNUM_10 = {''=>1000, ''=>100, ''=>10, ''=>1 }
def kan2num(kan)
  kan.scan(/([^千百十]*)([千百十]?)/).inject(-1) do |ret, (_1_9, unit)|
    ret + KANNUM_1_9[_1_9] * KANNUM_10[unit]
  end
end

kan2num("三千百六十八")   # => 3168
kan2num("千四百七十一")   # => 1471
kan2num("九千五百十二")   # => 9512
kan2num "二千三百四十三"  # => 2343
kan2num "二千三"          # => 2003
kan2num "十三"            # => 13
kan2num "五百"            # => 500
kan2num "五百十三"        # => 513
kan2num "千三百"          # => 1300
kan2num ""              # => 1000