Rubyの桁数カウント方法とは?桁数を揃えよう
- システム
エンジニア - Rubyの桁数をカウントする方法や桁数を揃える方法を知りたいです。
- プロジェクト
マネージャー - それでは、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と同じになります。
- システム
エンジニア - Rubyの桁数を数えるだけでも様々な方法があるのですね。
- プロジェクト
マネージャー - 解説を参考にして、ご自身でRubyのソースコードを書いて理解を深めていきましょう。
Rubyのソースコードを書いてみよう
Rubyの桁数カウント方法、桁数を揃える方法について紹介しました。カウントだけでも、文字列の長さでカウントしたり、計算してカウントしたり、様々な方法があります。
これらは、用途に応じて使い分ける必要があります。ぜひご自身でRubyのソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
Ruby新着案件New Job
-
RedmineプラグインおよびWEB開発/Ruby/東京都中央区/【WEB面談可】/在宅勤務
月給65万~65万円東京都中央区(新富町駅) -
Webアプリケーション運用保守/Ruby/東京都江東区/【WEB面談可】
月給50万~60万円東京都江東区(亀戸駅) -
Webアプリケーション開発(既存機能改修)のテスター/Ruby/東京都江東区/【WEB面談可】
月給25万~35万円東京都江東区(亀戸駅) -
Webアプリケーション開発(既存機能改修)/Ruby/東京都江東区/【WEB面談可】
月給45万~60万円東京都江東区(亀戸駅) -
Ansibelの自動構築/Ruby/東京都台東区/【WEB面談可】/テレワーク
月給46万~48万円東京都台東区(浅草駅) -
会計ワークフローの開発/Ruby/東京都新宿区/【WEB面談可】/フルリモート
月給46万~48万円東京都新宿区(新宿駅)