class Integer

整数を日本語等で表した時の文字列(self<0ならnil)を返すメソッド Integer#express を提供する。 補助的に使用する定数や関数は Integer::SuuConstantsAndSubFunctions モジュールで定義されている。 Integer クラスでこのモジュールを include している。 第一引数 lang には文字列を与える。 lang の先頭の文字(大文字小文字問わず)でどの言語に変換するかを判断する。 以下,変換可能な言語とその補足説明を記す。 d: 十進位取り

ただの Integer#to_s 。

f: 浮動小数点数

第二引数 acc を使用する。
ほぼ "%1.#{acc-1}e" % self.to_f と同じだが,Floatの範囲外の大きな整数でも使える。
acc が1未満の場合は ArgumentError を発生。

j: 日本語

一般に用いられる万進法による中数である。極以上を万万進とすることや,無量大数を分けることはしない。
千~においては省略しないこともままあるが,ここでは十,百,千~の位が1のとき一の文字を省略する。
千無量大数の十倍以上の数は表わせないので RangeError を発生。
参考:無量大数の彼方へ(http://www.sf.airnet.ne.jp/ts/language/largenumber.html)

m: 中数(万万進)。

日本語のように十,百,千~の位が1のとき一の文字を省略するのか定かでないが,ここでは省略しないことにした。
一千万無量大数の十倍以上の数は表わせないので RangeError を発生。
参考:無量大数の彼方へ(http://www.sf.airnet.ne.jp/ts/language/largenumber.html)

a: 英語(アメリカ式) b: 英語(ヨーロッパ式)

参考:Name of a Number(http://isthe.com/chongo/tech/math/number/number.html)

Public Instance Methods

express(lang='j', acc=7) click to toggle source
# File lib/kgl/suu.rb, line 155
def express(lang='j', acc=7)
        raise RangeError, 'negative integer' if self < 0
        ni = self.to_s
        ret = ''
        case lang
        when /^d/i #decimal
                ret = ni
        when /^f/i #float
                raise ArgumentError, 'nonpositive float accuracy' if acc < 1
                p = ni.length - 1
                d = ni[0, acc+1]
                while d.length < acc+1
                        d += '0'
                end
                d = d.to_i.div(10) + (((d.to_i%10)<5) ? 0 : 1)
                if d >= 10**acc
                        d = d.div(10)
                        p += 1
                end
                d = d.to_s
                d[1, 0] = '.'
                ret = "#{d}e+#{p}"
        when /^j/i #Japanese
                return Ichi[0] if self==0
                raise RangeError, 'too large for Japanese' if self >= 10**72
                m = 0
                while x = ni[-4, 4]
                        ret = Man[m] + ret if x != '0000'
                        0.upto(3){|i|
                                ret = ((i!=0 && x[3-i, 1]=='1') ? '' : Ichi[x[3-i, 1].to_i]) + Juu[i] + ret if x[3-i, 1] != '0'
                        }
                        ni = ni[0..-5]
                        m += 1
                end
                if ni != ''
                        ret = Man[m] + ret
                        x = ni.reverse.split(//)
                        ret = Ichi[x[0].to_i] + ret if x[0] != '0'
                        1.upto(2){|i|
                                ret = (x[i]=='1' ? '' : Ichi[x[i].to_i]) + Juu[i] + ret if x[i] && x[i] != '0'
                        }
                end
        when /^m/i #manmanshinhou
                return Ichi[0] if self==0
                raise RangeError, 'too large for manmanshinnhou' if self >= 10**136
                m = 0
                while x = ni[-8, 8]
                        ret = Man[m] + ret if x != '00000000'
                        0.upto(3){|i|
                                ret = Ichi[x[7-i, 1].to_i] + Juu[i] + ret if x[7-i, 1] != '0'
                        }
                        ret = Man[1] + ret if x != '0000'
                        0.upto(3){|i|
                                ret = Ichi[x[3-i, 1].to_i] + Juu[i] + ret if x[3-i, 1] != '0'
                        }
                        ni = ni[0..-9]
                        m = 1 if m == 0
                        m += 1
                end
                if ni != ''
                        ret = Man[m] + ret
                        x = ni.reverse.split(//)
                        0.upto(3){|i|
                                ret = Ichi[x[i].to_i] + Juu[i] + ret if x[i] && x[i] != '0'
                        }
                        ret = Man[1] + ret if x[4]
                        0.upto(2){|i|
                                ret = Ichi[x[4+i].to_i] + Juu[i] + ret if x[4+i] && x[4+i] != '0'
                        }
                end
        when /^a/i #American
                return One[0] if self==0
                m = -1
                while x = ni[-3, 3]
                        ret = us(m) + ' ' + ret if x != '000'
                        if x[1..2].to_i < 20
                                ret = One[x[1..2].to_i] + ' ' + ret if x[1..2] != '00'
                                ret = One[x[0, 1].to_i] + ' hundred ' + ret if x[0, 1] != '0'
                        else
                                ret = One[x[2, 1].to_i] + ' ' + ret if x[2, 1] != '0'
                                ret = Ten[x[1, 1].to_i] + ' ' + ret if x[1, 1] != '0'
                                ret = One[x[0, 1].to_i] + ' hundred ' + ret if x[0, 1] != '0'
                        end
                        ni = ni[0..-4]
                        m += 1
                end
                if ni != ''
                        ret = us(m) + ' ' + ret
                        x = ni.reverse.split(//)
                        if x[1] == '1'
                                ret = One[(x[1]+x[0]).to_i] + ' ' + ret
                        else
                                ret = One[x[0].to_i] + ' ' + ret if x[0] != '0'
                                ret = Ten[x[1].to_i] + ' ' + ret if x[1] && x[1] != '0'
                        end
                        ret = One[x[2].to_i] + ' hundred ' + ret if x[2] && x[2] != '0'
                end
        when /^b/i #British
                return One[0] if self==0
                m = 0
                while x = ni[-3, 3]
                        ret = gb(m) + ' ' + ret if x != '000'
                        if x[1..2].to_i < 20
                                ret = One[x[1..2].to_i] + ' ' + ret if x[1..2] != '00'
                                ret = One[x[0, 1].to_i] + ' hundred ' + ret if x[0, 1] != '0'
                        else
                                ret = One[x[2, 1].to_i] + ' ' + ret if x[2, 1] != '0'
                                ret = Ten[x[1, 1].to_i] + ' ' + ret if x[1, 1] != '0'
                                ret = One[x[0, 1].to_i] + ' hundred ' + ret if x[0, 1] != '0'
                        end
                        ni = ni[0..-4]
                        m += 1
                end
                if ni != ''
                        ret = gb(m) + ' ' + ret
                        x = ni.reverse.split(//)
                        if x[1] == '1'
                                ret = One[(x[1]+x[0]).to_i] + ' ' + ret
                        else
                                ret = One[x[0].to_i] + ' ' + ret if x[0] != '0'
                                ret = Ten[x[1].to_i] + ' ' + ret if x[1] && x[1] != '0'
                        end
                        ret = One[x[2].to_i] + ' hundred ' + ret if x[2] && x[2] != '0'
                end
        end
        while ret[-1, 1] == ' '
                ret = ret[0..-2]
        end
        ret
end
to_msm(fps=59.94) click to toggle source
# File lib/kgl.rb, line 6
def to_msm(fps=59.94)
        s, f = divmod(fps)
        ms = (f*1000).quo(fps).round
        m, s = s.divmod(60)
        %Q|#{m}:#{s}.#{ms}|
end