漢数字→数値変換メソッド
とりあえず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