2009-07-04 9 views

risposta

23

ho intenzione di eco tutti gli altri, ma mi limiterò a vi incoraggio a scaricare il activesupport gemma, così puoi semplicemente utilizzarlo come una biblioteca. Non hai bisogno di tutti i Rails per usare ordinalize.

 
% gem install activesupport 
... 
% irb 
irb> require 'rubygems' 
#=> true 
irb> require 'activesupport' 
#=> true 
irb> 3.ordinalize 
#=> "3rd" 
+2

Buon punto. È anche possibile ottenere questa funzionalità dalle faccette (http: //facets.rubyforge.org) library - richiede 'facet' o, per questo metodo, richiede 'facet/integer/ordinal' –

+0

Come si estrae solo l'ordinalizzazione? Voglio '' 3 th '' – Volte

+0

Volte: '3.ordinalize.sub (/ \ w + /, ' \ 0')' – rampion

8

Non credo Ruby ha, ma se si dispone di Rails, provate questo: -

puts 3.ordinalize #=> "3rd" 
+0

È disponibile anche in Facets. – Pesto

23
created_at.strftime("#{created_at.day.ordinalize} of %m, %y") 

produrrà "4 lug 2009"

+0

Ho dovuto aggiungere un # davanti {ma questo ha funzionato bene Grazie! – xenon

+0

come ordinalizzare le variabili stringa? Ho bisogno di girare% m per esempio. – Batman

+0

Questo è bello quando è necessario utilizzare il formato atipico "4 luglio" ma non è necessario ordinalizzare a mano se si utilizza il convenzionale "4 luglio 2009": 'created_at.to_date.to_s (: long_ordinal)' . –

38

meno che non sei utilizzando Rails, aggiungere questo metodo di ordinalize (codice spudoratamente sollevato dalla sorgente Rails) al Fixnum classe

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 

quindi formattare la data in questo modo:

> now = Time.now 
> puts now.strftime("#{now.day.ordinalize} of %B, %Y") 
=> 4th of July, 2009 
+0

Si noti che questa risposta è un po 'obsoleta. [Ecco come appare ora] (https://github.com/rails/rails/blob/3f96b6973b82ad17e443dd1d21be05996fb6fbf0/activesupport/lib/active_support/inflector/methods.rb#L312-L347) e [ecco l'estensione all 'Integer 'classe] (https://github.com/rails/rails/blob/08754f12e65a9ec79633a605e986d0f1ffa4b251/activesupport/lib/active_support/core_ext/integer/inflections.rb). – Dennis

1

Non so se rende molto (qualsiasi?) Più veloce di switch-case, ma ho fatto una costante con le terminazioni:

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"] 

Poi basta lo usavano come:

DAY_ENDINGS[date.mday] 

come avrei voluto il finale all'interno di un

<span>th</span> 
1

richiedono 'ActiveSupport'
1.ordinal => 'st'
1.ordinalize => '1st'

Problemi correlati