落書きノート

ふと自分が気になった事を書いてます

Ruby 練習問題 Stringクラスその2

“七千百二十三"といった、漢数字による数の表現を、「7123」のような数値に変換するメソッドkan2numを定義してください…という問題を解いてみました。

def kan2num(target)
  answer = 0
  stack = []
  target_split = target.split(//u)
  target_split.each{|ch|
    case ch
    when "" then
      stack.push(1)
    when "" then
      stack.push(2)
    when "" then
      stack.push(3)
    when "" then
      stack.push(4)
    when "" then
      stack.push(5)
    when "" then
      stack.push(6)
    when "" then
      stack.push(7)
    when "" then
      stack.push(8)
    when "" then
      stack.push(9)
    when "" then
      if !stack.empty? then
        answer += stack.pop * 1000
      else
        answer += 1000
      end
    when "" then
      if !stack.empty? then
        answer += stack.pop * 100
      else
        answer += 100
      end
    when "" then
      if !stack.empty? then
        answer += stack.pop * 10
      else
        answer += 10
      end
    end
  }

  if !stack.empty? then
    answer += stack.pop
  end

  p answer
end

kan2num("七千百二十三")
kan2num("九千五百四十")

スタックは一時的に保存するのに便利だったので、使ってみました。splitメソッドで全部分割してから、漢数字と数値を対応させてスタックに値をプッシュしました。必要になったらスタックからポップさせます。例外処理が起きないよう、配列の中身があるかどうかをif文でチェックしています。