Rubyで数値を日本語表記に変換
一つ思いついたメソッドがあったので実装してみた。
数値を日本語表記に変換したい
例えばこんな感じ
1000 => "千" 777 => "七百七十七" 1000000 => "百万"
ところがRubyにはそんなメソッドは存在しない。
* 存在しないなら作ればいいじゃない *
to_jメソッドとto_yenメソッド
ということで、作成したのがこの2つのメソッド。
https://github.com/siman-man/Ruby/blob/master/ryudai_rb/ryudai_rb4/lib/to_j.rb
# encoding: utf-8 class Integer def to_yen self.to_j + "円" end def to_j cardinal = %w(零 一 二 三 四 五 六 七 八 九) base_unit = %w(十 百 千) unit = %w(万 億 兆 京 垓 予 穣 溝 澗 正 裁 極 恒河沙 阿僧祇 那由多 不可思議 無量大数 洛叉 倶胝) return "零" if self == 0 numbers = [] self.to_s.each_char{ |num| numbers << num.to_i } number_blocks = numbers.reverse.each_slice(4).to_a japanese = "" block_size = number_blocks.size number_blocks.reverse.each_with_index do |block, index| str = "" block.each_with_index do |num, unit| if num != 0 str += base_unit[unit-1] if unit.nonzero? if num == 1 if unit == 0 || unit == 3 if index != block_size-1 str += cardinal[num] else str += cardinal[num] if str.size == 0 end end else str += cardinal[num] end end end japanese += str.reverse japanese += unit[number_blocks.size-(index+2)] if str.size.nonzero? && block_size != index+1 end japanese end end
まだちょっと作成途中なので少しコードが見づらいです。中身はIntegerクラスをオープンして中にto_jメソッドとto_yenメソッドを定義しています。
使用例
[1] pry(main)> require './to_j.rb' => true [2] pry(main)> 3.to_j => "三" [3] pry(main)> 1000.to_j => "千" [4] pry(main)> 123456789.to_j => "一億二千三百四十五万六千七百八十九" [5] pry(main)> 123456789123456789.to_j => "十二京三千四百五十六兆七千八百九十一億二千三百四十五万六千七百八十九"
今のところ良い感じに動いてくれていますが、使い道がわからないです。一方to_yenメソッドはto_jメソッドに「円」を追加しただけです。
[1] pry(main)> require './to_j.rb' => true [2] pry(main)> 1.to_yen => "一円" [3] pry(main)> 10.to_yen => "十円" [4] pry(main)> 10000.to_yen => "一万円" [5] pry(main)> 1000000.to_yen => "百万円" [6] pry(main)> 123456789.to_yen => "一億二千三百四十五万六千七百八十九円" [7] pry(main)> 12345678998765432123456789.to_yen => "十二予三千四百五十六垓七千八百九十九京八千七百六十五兆四千三百二十一億二千三百四十五万六千七百八十九円"
ちなみに2.0と1.9での動作は確認したのですが、1.8については動作しないです。1.8は文字を配列として参照すると文字ではなく、バイト値を返すためうまく動作しません。そこはご了承下さい。
今後色々とコードの修正を行なって。初めてのgemを作ってみようかなと画策中です。