Class: Integer

Inherits:
Object
  • Object
show all
Includes:
SuuConstantsAndSubFunctions
Defined in:
lib/kgl/suu.rb,
lib/kgl.rb

Overview

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

f: 浮動小数点数

j: 日本語

m: 中数(万万進)。

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

Defined Under Namespace

Modules: SuuConstantsAndSubFunctions

Constant Summary

Constants included from SuuConstantsAndSubFunctions

SuuConstantsAndSubFunctions::Cen, SuuConstantsAndSubFunctions::Gin, SuuConstantsAndSubFunctions::Ichi, SuuConstantsAndSubFunctions::Juu, SuuConstantsAndSubFunctions::Man, SuuConstantsAndSubFunctions::Mi, SuuConstantsAndSubFunctions::One, SuuConstantsAndSubFunctions::Ten, SuuConstantsAndSubFunctions::Un

Instance Method Summary collapse

Methods included from SuuConstantsAndSubFunctions

gb, us

Instance Method Details

#express(lang = 'j', acc = 7) ⇒ Object

Raises:

  • (RangeError)


155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# 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) ⇒ Object



6
7
8
9
10
11
# 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