システム開発において、日付/時刻や数値を書式(フォーマット)指定して文字列にすることは多くのシーンであります。
この記事では、RubyのDateやDateTimeなどの日付型の値や、Integer、Floatなどの数値をフォーマット指定で文字列に変換する方法を解説します。
日付のフォーマット
Rubyで日付型をフォーマット指定で文字列に変換する時は、strftimeメソッドを使用します。
strftimeメソッドは日付を扱うDateクラス、時間を扱うTimeクラス、日時を扱うDateTimeクラスすべてに用意されています。
strftimeメソッドの構文は次の通りです。
Date.strftime([format文字列])
Time.strftime([format文字列])
DateTime.strftime([format文字列])
日付をフォマットするサンプルコード
strftimeメソッドを使って、日付や時刻をフォーマットするサンプルコードをいくつか見ていきましょう。
次のコードはDate.todayで取得した日付を、YYYY/MM/DD形式の日付文字列にフォーマットしています。
require "date"
d = Date.today
puts d.strftime("現在日付:%Y/%m/%d")
【実行結果】
------------------
現在日付:2021/02/03
次は時刻を扱うTimeクラスのstrftimeメソッドを呼んで、時刻をHH:MM:SS形式でフォーマットしてみましょう。
require "date"
t = Time.now
puts t.strftime("現在時刻:%H:%M:%S")
【実行結果】
------------------
現在時刻:23:48:00
最後は、日付と時刻が両方扱えるDateTimeクラスの値を、strftimeメソッドでフォーマットしてみます。
require "date"
dt = DateTime.now
puts dt.strftime("現在日時:%Y/%m/%d %H:%M:%S")
【実行結果】
------------------
現在日時:2021/02/03 23:52:24
format文字列
strftimeメソッドで format文字列は、前のサンプルコードで使ったもの以外にも、次の表に示す文字列が使用できます。
format文字列 | 説明 | 出力例 |
---|---|---|
%A | 曜日名 | Sunday, Monday |
%a | 曜日省略名 | Sun, Mon |
%B | 月の名前 | January, February |
%b | 月の省略名 | Jan, Feb |
%c | 日付と時刻 | Thu Feb 4 00:15:53 2021 |
%d | 日 | 01-31 |
%H | 24時間制の時 | 00-23 |
%I | 12時間制の時 | 01-12 |
%j | 年中の通算日 | 001-366 |
%M | 分 | 00-59 |
%m | 月(ゼロ埋め) | 01-12 |
%p | 午前/午後 | AM,PM |
%S | 秒 | 00-59 |
%U | 1/1以降の最初の日曜日が第1週とした週の数 | 00-53 |
%W | 1/1以降の最初の月曜日が第1週とした週の数 | 00-53 |
%w | 曜日を表す数字。 | 0-6 |
%X | 時刻 | 00:00:00 |
%x | 日付 | 02/04/21 |
%Y | 西暦の年 | 2021 |
%y | 西暦の年(2桁) | 21 |
%Z | タイムゾーン | +00:00 |
%のエスケープする
strftimeメソッドに指定する format文字列は、年であれば%Y、月であれば%mなど、すべて特殊記号の%から始まります。
%自身を特殊記号ではなく通常の文字列として出力したい場合は、%%のようにしてエスケープします。
require "date"
dt = Date.today
puts dt.strftime("%Y/%m/%dの降水確率は50%%です")
【実行結果】
------------------
2021/02/04の降水確率は50%です
数値のフォーマット
次は、Rubyで数値のフォーマットを行う方法を解説していきます。
フォーマット指定で数値を文字列に変換することで、指定桁数までゼロを挿入する、いわゆる「ゼロ埋め」などができます。
Rubyでは、数値をフォーマットする方法としてsprintfメソッド とString#%を使う2つの方法があります。
sprintfで数値をフォーマット
まずは、sprintfメソッド の使い方を見ていきましょう。Rubyのsprintfメソッド は基本的はC言語と同じ構文・動作をします。
まずは、単純に数値を文字列にする%dを書式指示子に指定して、数値を文字列化するサンプルコードを見てみましょう。
puts sprintf("%d", 10) #=> "10"
【実行結果】
------------------
"10"
書式指示子は複数指定でき、その場合は、指定した指示子の左から順に対応するように、第2引数以降に値を指定します。
puts sprintf("%d、%d、%d", 10, 20, 30)
【実行結果】
------------------
"10、20、30"
指定桁数に満たない時に左側にゼロを埋める場合、%0<ゼロ埋めする桁数>dのように書式指示子に指定します。
次のコードは、数値を10桁でゼロ埋めするサンプルコードです。
puts sprintf("%010d", 10)
【実行結果】
------------------
"0000000010"
ゼロ埋めではなく、指定桁数に満たない時にスペースを埋める場合は、%<ゼロ埋めする桁数>dのように書式指示子を指定します。
次のコードは、数値が10桁に満たない時に、左側にスペースを埋めるサンプルコードです。
puts sprintf("%10d", 10)
【実行結果】
------------------
" 10"
浮動小数点で、小数点以下の桁数を指定する場合は次のように指示子fを使用します。
puts sprintf("%.5f", 12)
puts sprintf("%.5f", 0.5)
【実行結果】
------------------
"12.00000"
"0.50000"
2進、8進、16進数の形式で数値を文字列化することもできます。
puts sprintf("2進数:%#B", 10)
puts sprintf("8進数:%#o", 10)
puts sprintf("16進数:%#X", 10)
【実行結果】
------------------
2進数:0B1010
8進数:012
16進数:0XA
String#%で数値をフォーマット
Rubyではsprintfメソッドの他に、“%d” % 10のような形で指示子と値を%で区切ってフォーマットをかけることができます。
sprintfよりもString#%を使用する方が、よりRubyらいしコードの書き方で、また、String#%で使用できる指示子はsprintfメソッドと基本的に同じであるため、積極的に使っていきましょう。
String#%で数値をフォーマットするサンプルコードをいくつか見ていきましょう。
まずは、数値を10桁でゼロ埋めするコードです。記述の仕方は違えど、使用する指示子は“%010d”とsprintfメソッドと同じです。
puts "%010d" % 120
【実行結果】
------------------
0000000120
浮動小数点の場合も、当然使用する指示子はsprintfと同じです。
puts "%.5f" % 1
puts "%.5f" % 0.5
【実行結果】
------------------
1.00000
0.50000
3桁ごとにカンマ編集する
金額を扱うようなシステムであれば、数値を3桁毎にカンマ編集するといったシーンがあるでしょう。
sprintfメソッド String#%は、3桁ごとにカンマ編集するといったことは出来ないため、:delimitedメソッド を使用します。
12345678.to_s(:delimited)
よく使うフォーマットは覚えておこう
Rubyで日付や数値をフォーマットする方法を解説してきました。
フォーマット処理は非常によく使うため、是非覚えておきましょう。
【関連記事】
▶【Java入門】配列と初期化につい
浮動小数点をフォーマットする際、指示子で指定した小数点以下の桁数よりも、実際に指定する小数点の桁数の方が多い場合、四捨五入された結果でフォーマットされるため注意しましょう。
例えば“%.5f” % 0.123456のようなコードの場合、結果は小数点「0.12346」となり小数点以下の桁数が5桁となるように四捨五入されます。