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.
=> "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