Question

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?

Was it helpful?

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'

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top