「7月3日」や「10月1日」などの文字列を表示できるように日付オブジェクトをフォーマットしたいと思います。Date.strftimeに、「rd」と「st」を生成するオプションが見つかりません。誰かがこれを行う方法を知っていますか?
8 に答える
Railsを使用している場合を除き、このordinalizeメソッド (Rails ソースから厚かましく持ち上げたコード) をFixnumクラスに追加します。
class Fixnum
def ordinalize
if (11..13).include?(self % 100)
"#{self}th"
else
case self % 10
when 1; "#{self}st"
when 2; "#{self}nd"
when 3; "#{self}rd"
else "#{self}th"
end
end
end
end
次に、日付を次のようにフォーマットします。
> now = Time.now
> puts now.strftime("#{now.day.ordinalize} of %B, %Y")
=> 4th of July, 2009
created_at.strftime("#{created_at.day.ordinalize} of %m, %y")
「2009 年 7 月 4 日」を制作予定
他の皆さんにも同じことを言いますが、activesupport
gem をダウンロードしてライブラリとして使用できるようにすることをお勧めします。すべての Rails を使用する必要はありませんordinalize
。
% gem install activesupport ... %irb irb> require 'rubygems' #=>真 irb>「アクティブサポート」が必要 #=>真 irb> 3.順序化 #=>「3番目」
Rubyにはないと思いますが、Railsをお持ちの場合は、これを試してください:-
puts 3.ordinalize #=> "3rd"
それがswitch-caseよりもはるかに(どれか?)速くなるかどうかはわかりませんが、エンディングで定数を作成しました:
DAY_ENDINGS = ["th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "st"]
次に、次のように使用しました。
DAY_ENDINGS[date.mday]
私が望んでいたように
<span>th</span>
'activesupport' が必要
1.ordinal => 'st'
1.ordinalize => '1st'
require 'time'
H = Hash.new do |_,k|
k +
case k
when '1', '21', '31'
'st'
when '2', '22'
'nd'
when '3', '23'
'rd'
else
'th'
end
end
def fmt_it(time)
time.strftime("%A %-d, %-l:%M%P").sub(/\d+(?=,)/, H)
end
fmt_it(Time.new)
#=> "Wednesday 9th, 1:36pm"
fmt_it(Time.new + 3*24*60*60)
#=> "Saturday 12th, 3:15pm"
2 番目の引数としてハッシュ ( ) を取るString#sub ( を使用できます)の形式を使用しました。sub!
H
によって使用される正規表現は、sub
「カンマが続く 1 つ以上の数字に一致する」と読み取ります。(?=,)
は前向きな先読みです。
ブロックを取るHash::newH
の形式を使用して(空の) ハッシュを作成しました。これは単純に、 が key を持たない場合、ブロックによって計算された値を返すことを意味します。この場合、ハッシュは空であるため、ブロックは常に目的の値を返します。このブロックは、ハッシュ (ここでは) と評価されるキーの 2 つの引数を取ります。前者をアンダースコアで表し、ブロックで使用されていないことを示しています)。いくつかの例:H
k
H[k]
H
H['1'] #=> "1st"
H['2'] #=> "2nd"
H['3'] #=> "3rd"
H['4'] #=> "4th"
H['9'] #=> "9th"
H['10'] #=> "10th"
H['11'] #=> "11th"
H['12'] #=> "12th"
H['13'] #=> "13th"
H['14'] #=> "14th"
H['22'] #=> "22nd"
H['24'] #=> "24th"
H['31'] #=> "31st"
ディレクティブのフォーマットについては、 Time#strftimeを参照してください。