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: 十進位取り

ただの 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)

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