DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Peter has posted 12 posts at DZone. View Full User Profile

Ordinals For All Numeric Types

08.04.2006
| 10014 views |
  • submit to reddit
        This snippet will extend all numerical types with a method for returning the English ordinal, i.e. 1st, 2nd, 3rd, 4th, etc.

class Numeric
  def ordinal
    cardinal = self.to_i.abs
    if (10...20).include?(cardinal) then
      cardinal.to_s << 'th'
    else
      cardinal.to_s << %w{th st nd rd th th th th th th}[cardinal % 10]
    end
  end
end
 
[1, 22, 123, 10, -3.1415].collect { |i| i.ordinal }
=> ["1st", "22nd", "123rd", "10th", "3rd"]

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.    

Comments

Claudio Petasec... replied on Thu, 2009/02/05 - 6:05am

class Integer def ordinal to_s + ([[nil, 'st','nd','rd'],[]][self / 10 == 1 && 1 || 0][self % 10] || 'th') end end

Snippets Manager replied on Fri, 2006/06/09 - 4:49am

class Numeric def ordinal to_i.to_s + ((10..20) === (n = to_i.abs % 100) ? 'th' : { 1 => 'st', 2 => 'nd', 3 => 'rd' }. fetch(n % 10, 'th') ) end end

Snippets Manager replied on Wed, 2006/08/16 - 1:29am

irb(main):011:0> 112.ordinal => "112nd" Hmm...needs to check the last 2 digits for a match in the teens. Here's a patched version: class Numeric def ordinal cardinal = self.to_i.abs if (10...20).include?(cardinal%100) then cardinal.to_s << 'th' else cardinal.to_s << %w{th st nd rd th th th th th th}[cardinal % 10] end end end