読者です 読者をやめる 読者になる 読者になる

simanのブログ

ゆるふわプログラマー。競技プログラミングやってます。Ruby好き

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を作ってみようかなと画策中です。