Rubyの桁数カウント方法とは?桁数を揃えよう

- SE
- Rubyの桁数をカウントする方法や桁数を揃える方法を知りたいです。
- PM
- それでは、Rubyの桁数をカウントする方法や桁数を揃える方法をご紹介していきましょう。
この記事でわかること
Rubyの桁数について
今回は、Rubyの桁数について説明します。桁数をカウントする方法および、桁数を揃える方法について紹介します。
Rubyの桁数に興味のある方はぜひご覧ください。
桁数のカウント(文字列に変換)
Rubyでの桁数カウント方法の1つとして、数字を文字列に変換して、文字列長から桁数をカウントできます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
def count_digits(num) num.abs.to_s.length end puts count_digits(1) # 1 puts count_digits(-2) # 1 puts count_digits(13) # 2 puts count_digits(-123) # 3 |
実行結果は以下のようになります。
1 2 3 4 |
1 1 2 3 |
マイナスの数字にも対応できるように、abs関数で絶対値にします。その後、to_s関数で文字列に変換し、length関数で文字列長を求めて桁数としています。
length関数ではなく、size関数でも桁数カウントできます。
1 2 3 4 5 6 7 8 9 10 11 |
def count_digits(num) num.abs.to_s.size end puts count_digits(1) # 1 puts count_digits(-2) # 1 puts count_digits(13) # 2 puts count_digits(-123) # 3 |
実行結果が同じになることが分かります。
このように、数字を文字列に変換して、文字列長から桁数をカウントできます。小数について、整数部の桁数をカウントしたい場合は、to_i関数でintに変換してから変換すればよいです。
桁数のカウント(計算する)
Rubyでは、文字列に変換するのではなく、桁数を計算でカウントできます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
def count_digits(num) Math.log10(num.abs).to_i + 1 end puts count_digits(1) # 1 puts count_digits(-2) # 1 puts count_digits(13) # 2 puts count_digits(-123) # 3 |
実行結果は以下のようになります。
1 2 3 4 |
1 1 2 3 |
log10は常用対数で、numは10の何条になるのかを計算します。例えば、10は10の1乗なので、log10(10)=1.0になります。それに1を加えて、2(桁)となります。
また、to_iもポイントです。例えば、5の桁数は1です。
log10(5)の結果をintに変換することで0になり、1を加算して1桁となるわけです。
1 2 3 4 5 |
puts Math.log10(5) # 0.6989700043360189 puts Math.log10(5).to_i # 0 puts Math.log10(5).to_i + 1 # 1 |
常用対数ではなく、10で何回割ることができるかで桁数をカウントすることもできます。実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
def count_digits(num) num = num.abs 1.upto Float::INFINITY do |i| # nが10未満になるまで10で割る break i if num < 10 num /= 10 end end puts count_digits(1) # 1 puts count_digits(-2) # 1 puts count_digits(13) # 2 puts count_digits(-123) # 3 |
実行結果は以下のようになります。
1 2 3 4 |
1 1 2 3 |
桁数カウントの使い分け
Rubyの桁数カウント方法について、以下の2つを紹介しました。
・文字列に変換してカウント
・計算してカウント
これらは桁数の多さで使い分けるとよいでしょう。桁数が多い数字を扱う場合、文字列に変換してカウントする方が早いです。
一方、桁数がそれほど多くない数字の場合、計算してカウントする方が早いです。実際に計算してみると、違いが分かります。
桁数の指定(round/ceil/floor)
Rubyで小数点以下の桁数をそろえたい場合、round/ceil/floorなどの関数を使用します。
小数点以下N桁で四捨五入したい場合、round関数を使用します。例えば、小数点以下2桁までを表示させたい場合、round(2)と記述します。
1 2 3 4 5 6 7 8 9 10 |
val = 1.2345 puts val.round puts val.round(1) puts val.round(2) puts val.round(3) puts val.round(4) |
実行結果は以下のようになります。
1 2 3 4 5 |
1 1.2 1.23 1.235 1.2345 |
round(2)で小数点以下4桁目が四捨五入されていることが分かります。
小数点以下N桁で切り上げたい場合、ceil関数を使用します。
1 2 3 4 5 6 7 8 9 10 |
val = 1.2345 puts val.ceil puts val.ceil(1) puts val.ceil(2) puts val.ceil(3) puts val.ceil(4) |
実行結果は以下のようになります。
1 2 3 4 5 |
2 1.3 1.24 1.235 1.2345 |
小数点以下N桁で切り捨てたい場合、floor関数を使用します。
1 2 3 4 5 6 7 8 9 10 |
val = 1.2345 puts val.floor puts val.floor(1) puts val.floor(2) puts val.floor(3) puts val.floor(4) |
実行結果は以下のようになります。
1 2 3 4 5 |
1 1.2 1.23 1.234 1.2345 |
このように、小数点以下の桁数をそろえたい場合、round/ceil/floorなどの関数を使用します。
桁数の指定(sprintf)
Rubyのsprintfは、与えられた引数を指定フォーマットの文字列として返却します。整数部・小数点以下ともに、桁数を指定できます。
10桁に揃えるサンプルとして、実際のソースコードを見てみましょう。右詰めしたり、左詰めしたり、0埋めしたりなど、様々な表記方法があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 数値を右詰め10桁で指定します。 puts sprintf("%10d", 12345) #=> " 12345" # 数値を左詰め10桁で指定します。 puts sprintf("%-10d", 12345) #=> "12345 " # 数値を符号付き10桁で指定します。 puts sprintf("%+10d", 12345) #=> " +12345" # 数値を右詰めで指定し、余った空白をゼロで埋めて10桁にします。 puts sprintf("%010d", 12345) #=> "0000012345" # 10桁で小数点以下の桁数を3桁にします。 puts sprintf("%10.3f", 123.45) #=> " 123.450" # 文字列を右詰め10文字で指定します。 puts sprintf("%10s", "abcde") #=> " abcde" # 文字列を左詰め10文字で指定します。 puts sprintf("%-10s", "abcde") #=> "abcde " |
実行結果は以下のようになります。
1 2 3 4 5 6 7 |
12345 12345 +12345 0000012345 123.450 abcde abcde |
10桁で揃えられた様々な出力ができることが分かります。
桁数の指定(String#%)
sprintfと同じフォーマットで、RubyではString#%でも桁数を揃えることができます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 数値を右詰め10桁で指定します。 puts "%10d"% 12345 #=> " 12345" # 数値を左詰め10桁で指定します。 puts "%-10d"% 12345 #=> "12345 " # 数値を符号付き10桁で指定します。 puts "%+10d"% 12345 #=> " +12345" # 数値を右詰めで指定し、余った空白をゼロで埋めて10桁にします。 puts "%010d"% 12345 #=> "0000012345" # 10桁で小数点以下の桁数を3桁にします。 puts "%10.3f"% 123.45 #=> " 123.450" # 文字列を右詰め10文字で指定します。 puts "%10s"% "abcde" #=> " abcde" # 文字列を左詰め10文字で指定します。 puts "%-10s"% "abcde" #=> "abcde " |
実行結果は以下のようになります。
1 2 3 4 5 6 7 |
12345 12345 +12345 0000012345 123.450 abcde abcde |
10桁で揃えられた様々な出力ができることが分かります。結果もsprintfと同じになります。
- SE
- Rubyの桁数を数えるだけでも様々な方法があるのですね。
- PM
- 解説を参考にして、ご自身でRubyのソースコードを書いて理解を深めていきましょう。
Rubyのソースコードを書いてみよう
Rubyの桁数カウント方法、桁数を揃える方法について紹介しました。カウントだけでも、文字列の長さでカウントしたり、計算してカウントしたり、様々な方法があります。
これらは、用途に応じて使い分ける必要があります。ぜひご自身でRubyのソースコードを書いて、理解を深めてください。