トップ «前の日記(2010-12-08) 最新 次の日記(2010-12-10)» 編集

日々の破片

著作一覧

2010-12-09

_ 漢数字からアラビア数字

以前、どこかで漢数字からアラビア数字へ変換するという問題を見かけたが、実際に必要になって書いてみたら実に気に食わない。あのとき、ちゃんとうまい解答例を見ておけばよかった。

ここでやりたいのは単純で、一~五十くらいまでで、十一とか三十一とかの表記となる。これを1~50、11とか31とかに直す。

最初こう書いた。

KINDEX = "十一二三四五六七八九"
ARABIC = "0123456789"
def kj_to_arabic(s)
  r = ''
  s.each_char do |c|
    r << ARABIC[KINDEX.index(c)]
  end
  if r =~ /¥A0(¥d)¥Z/
    "1#{$1}"
  elsif r == '0'
    '10'
  else  
    r.gsub(/0(¥d)¥Z/, '¥1')
  end  
end

たかがこんなことに//が2回も出てくるのも気に食わないし、なんか不細工だ。

そこで次に//を使わずにこう書いてみた。

KINDEX = "十一二三四五六七八九"
ARABIC1 = ['10', '1', '2', '3', '4', '5', '6', '7', '8', '9']
ARABIC2 = ['1', '1', '2', '3', '4', '5', '6', '7', '8', '9']
ARABIC3 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
ARABIC4 = ['', '1', '2', '3', '4', '5', '6', '7', '8', '9']
def kj_to_arabic(s)
  case s.size
  when 1
    ARABIC1[KINDEX.index(s)]
  when 2
    ARABIC2[KINDEX.index(s[0])] + ARABIC3[KINDEX.index(s[1])]
  else
    r = ''
    s.each_char do |c|
      r << ARABIC4[KINDEX.index(c)]
    end
    r
  end
end

最初のよりはましな気もするが、あまりにもアドホックに過ぎる。(追記:3文字なら2文字目は無視すればいいな。)

というわけで、よりスマートに書くにはどうすれば良いのだろう?

本日のツッコミ(全2件) [ツッコミを入れる]
_ eban (2010-12-10 01:49)

以前ゴルフ場で出されました。まあ、ゴルフなので参考になるかどうか。<br>http://golf.shinh.org/p.rb?Japanese+numeral+for+Ruby+kaigi#Ruby

_ arton (2010-12-10 11:06)

ありがとうございます。ゴルフだったのか。見てみます。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え