How do I format a date in ruby to include “rd” as in “3rd” [duplicate]
Question
This question already has an answer here:
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?
Solution
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"
OTHER TIPS
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
created_at.strftime("#{created_at.day.ordinalize} of %m, %y")
Will produce "4th of July, 2009"
I don't think Ruby has it, but if you have Rails, try this:-
puts 3.ordinalize #=> "3rd"
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.
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>
require 'activesupport'
1.ordinal => 'st'
1.ordinalize => '1st'