25

「7月3日」や「10月1日」などの文字列を表示できるように日付オブジェクトをフォーマットしたいと思います。Date.strftimeに、「rd」と「st」を生成するオプションが見つかりません。誰かがこれを行う方法を知っていますか?

4

8 に答える 8

40

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
于 2009-07-04T12:08:04.700 に答える
28
created_at.strftime("#{created_at.day.ordinalize} of %m, %y")

「2009 年 7 月 4 日」を制作予定

于 2009-07-04T10:43:58.207 に答える
24

他の皆さんにも同じことを言いますが、activesupportgem をダウンロードしてライブラリとして使用できるようにすることをお勧めします。すべての Rails を使用する必要はありませんordinalize

% gem install activesupport
...
%irb
irb> require 'rubygems'
#=>真
irb>「アクティブサポート」が必要
#=>真
irb> 3.順序化
#=>「3番目」
于 2009-07-04T17:56:20.527 に答える
8

Rubyにはないと思いますが、Railsをお持ちの場合は、これを試してください:-

puts 3.ordinalize #=> "3rd"
于 2009-07-04T10:34:25.577 に答える
1

それが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>
于 2014-06-11T09:47:54.903 に答える
1

'activesupport' が必要
1.ordinal => 'st'
1.ordinalize => '1st'

于 2014-12-11T11:29:05.033 に答える
0
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 つの引数を取ります。前者をアンダースコアで表し、ブロックで使用されていないことを示しています)。いくつかの例:HkH[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を参照してください。

于 2020-09-10T18:46:12.780 に答える