はじめに
もうすぐ平成が終わりますね。
元号変更に伴い、漢数字を処理しなければならないエンジニアもそこそこ多いのではないでしょうか?( 私です )
思考停止したい
そこで漢数字を数字に変換する方法を検索すると、
漢数字を変換するgemやサンプルコードが見つかるものの、ループや再帰などを使用したもので、安心して思考停止できないことが気になりました。
そこで、思考停止するために本気で思考し、上手く思いついたので内容を共有します。
わずか7行
ループも再帰も使わない、わずか7行のコードになりました。
多分これが一番簡単だと思います。
def convert_kansuji(text)
text.tr('〇一二三四五六七八九', '0123456789')
.gsub(/(\d+)?十(\d+)?/) { ($1 || 1).to_i * 10 + $2.to_i }
.gsub(/(\d+)?百(\d+)?/) { ($1 || 1).to_i * 100 + $2.to_i }
.gsub(/(\d+)?千(\d+)?/) { ($1 || 1).to_i * 1000 + $2.to_i }
.gsub(/(\d+)万(\d+)?/) { $1.to_i * 10000 + $2.to_i }
.gsub(/(\d+)億(\d+)?/) { $1.to_i * 100000000 + $2.to_i }
.gsub(/(\d+)兆(\d+)?/) { $1.to_i * 1000000000000 + $2.to_i }
end
実行例
convert_kansuji("平成三十年七月三日 宣言 御給料月額三兆五百億八千五十五万百三十円以上 欲イ")
# => "平成30年7月3日 宣言 御給料月額3050080550130円以上 欲イ"
簡単な解説
あまり説明することがないので、順を追って7ステップ(7行)を説明します。
1. 0-9の漢数字を半角数字に置き換えます
tr('〇一二三四五六七八九', '0123456789')
# => "平成3十年7月3日 宣言 御給料月額3兆5百億8千5十5万百3十円以上 欲イ"
2. 十の前後の数字に着目し、漢数字を数字に変換します
gsub(/(\d+)?十(\d+)?/) { ($1 || 1).to_i * 10 + $2.to_i }
# => "平成30年7月3日 宣言 御給料月額3兆5百億8千55万百30円以上 欲イ"
3. 百の前後の数字に着目し、漢数字を数字に変換します
gsub(/(\d+)?百(\d+)?/) { ($1 || 1).to_i * 100 + $2.to_i }
# => "平成30年7月3日 宣言 御給料月額3兆500億8千55万130円以上 欲イ"
4. 千の前後の数字に着目し、漢数字を数字に変換します
gsub(/(\d+)?千(\d+)?/) { ($1 || 1).to_i * 1000 + $2.to_i }
# => "平成30年7月3日 宣言 御給料月額3兆500億8055万130円以上 欲イ"
5. 万の前後の数字に着目し、漢数字を数字に変換します
gsub(/(\d+)万(\d+)?/) { $1.to_i * 10000 + $2.to_i }
# => "平成30年7月3日 宣言 御給料月額3兆500億80550130円以上 欲イ"
6. 億の前後の数字に着目し、漢数字を数字に変換します
gsub(/(\d+)億(\d+)?/) { $1.to_i * 100000000 + $2.to_i }
# => "平成30年7月3日 宣言 御給料月額3兆50080550130円以上 欲イ"
7. 兆の前後の数字に着目し、漢数字を数字に変換します
gsub(/(\d+)兆(\d+)?/) { $1.to_i * 1000000000000 + $2.to_i }
# => "平成30年7月3日 宣言 御給料月額3050080550130円以上 欲イ"
以上です。
これで安心して平成を乗り切れそうです。
他のプロダクトでも使う機会が出て来たりご要望をいただければ、ジェムおじさんになってgem作らさせていただきます!!!!