Rubyチュートリアル 3日目

あけましておめでとうございます。
年末年始は忙しくてまったくできなかったけど、やっと落ち着いたのでチュートリアルをぼちぼち進めてます。
プログラミング入門 - Rubyを使って - (原文:Learn to Program)

『8.メソッドの作り方 』 englishNumber


たとえば22のようなひとつの数をもらって、その英語読みの文字列(この場合'twenty-two'のような)を返します。


中略

  • 上のenglishNumberを拡張してみましょう。最初にthousand(千の桁)を導入してください。上のプログラムでは 'ten hundred'となっているところを'one thousand'を返すように、あるいは、'one hundred hundred'の代わりに'ten thousand'を返すようにします。
  • englishNumberにさらに改良を加えましょう。 milion(百万)を加えます。その結果、'one thousand thousand'の代わりに 'one million'が得られるようにします。その後、billion(十億)とかtrillion(兆)とかを追加していってみましょう。どこまでいけるでしょうか?
#! /usr/local/bin/ruby

def englishNumber number
	if number < 0
		return '負でない数を入力してください.'
	end
	if number == 0
		return 'zero'
	end

	numString = ''

	onesPlace  = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
	tensPlace = ['ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
	teenagers = ['eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']

	left  = number

	write = left/1000000000
	left  = left - write*1000000000
	if write > 0
		billions = englishNumber write
		numString << billions + ' billion'
		if left > 0
			numString << ' '
		end
	end

	write = left/1000000
	left  = left - write*1000000
	if write > 0
		millions =  englishNumber write
		numString << millions + ' million'
		if left > 0
			numString << ' '
		end
	end

	write = left/1000
	left  = left - write*1000
	if write > 0
		thousands =  englishNumber write
		numString << thousands + ' thousand'
		if left > 0
			numString << ' '
		end
	end

	write = left/100
	left  = left - write*100
	if write > 0

		hundreds  = englishNumber write
		numString << hundreds + ' hundred'
		if left > 0
			numString << ' '
		end
	end

	write = left/10
	left  = left - write*10
	if write > 0
		if ((write == 1) && (left > 0))
			numString << teenagers[left-1]
			left = 0
		else
			numString << tensPlace[write-1]
		end

		if left > 0
			numString << '-'
		end
	end

	write = left
	left = 0
	if write > 0
		numString << onesPlace[write-1]
	end

	numString
end

おまけ
漢数字で表示するプログラム

#!ruby -Ks

def japaneseNumber number

	if number < 0
		return '正の数を入力してください.'
	end
	if number == 0
		return 'zero'
	end

	numString = ''

	ones = ['', '', '', '', '', '', '', '', '']
	tens = ['', '二十', '三十', '四十', '五十', '六十', '七十', '八十', '九十']
	left  = number

	write = left/100
	left  = left - write*100
	if write > 0
		if write == 1
			numString << ''
		else
			hundreds = japaneseNumber write
			numString << hundreds + ''
		end
	end

	write = left/10
	left  = left - write*10
	if write > 0
		numString << tens[write-1]
	end

	write = left
	left  = 0
	if write > 0
		numString << ones[write-1]
	end

	numString
end

#!ruby -Ks にしないと文字化けしてしまう。