问题
I want to format a date object so that I can display strings such as "3rd July" or "1st October". I can't find an option in Date.strftime to generate the "rd" and "st". Any one know how to do this?
回答1:
I'm going to echo everyone else, but I'll just encourage you to download the activesupport
gem, so you can just use it as a library. You don't need all of Rails to use ordinalize.
% gem install activesupport ... % irb irb> require 'rubygems' #=> true irb> require 'activesupport' #=> true irb> 3.ordinalize #=> "3rd"
回答2:
Unless you're using Rails, add this ordinalize method (code shamelessly lifted from the Rails source) to the Fixnum class
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
Then format your date like this:
> now = Time.now
> puts now.strftime("#{now.day.ordinalize} of %B, %Y")
=> 4th of July, 2009
回答3:
created_at.strftime("#{created_at.day.ordinalize} of %m, %y")
Will produce "4th of July, 2009"
回答4:
I don't think Ruby has it, but if you have Rails, try this:-
puts 3.ordinalize #=> "3rd"
回答5:
Seems I'm revisiting this topic for a third time, so I've updated my gist with some extra comments / usage.
https://gist.github.com/alterisian/4154152
Cheers, Ian.
回答6:
I don't know if it makes it that much (any?) faster than switch-case, but I made a constant with the endings:
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"]
Then just used it like:
DAY_ENDINGS[date.mday]
As I wanted the ending inside a
<span>th</span>
回答7:
require 'activesupport'
1.ordinal => 'st'
1.ordinalize => '1st'
来源:https://stackoverflow.com/questions/1081926/how-do-i-format-a-date-in-ruby-to-include-rd-as-in-3rd