29 votes

Comment convertir 1 en "premier", 2 en "deuxième", et ainsi de suite, en Ruby ?

Y a-t-il une méthode intégrée en Ruby pour supporter cela?

30voto

Asnad Atta Points 380

Si vous êtes dans Rails, vous pouvez convertir 1 en 1er, 2 en 2ème, et ainsi de suite, en utilisant ordinalize.

Exemple:

1.ordinalize # => "1er"
2.ordinalize # => "2ème"
3.ordinalize # => "3ème"
...
9.ordinalize # => "9ème"
...
1000.ordinalize # => "1000ème"

Et si vous voulez des virgules dans les grands nombres:

number_with_delimiter(1000, :delimiter => ',') + 1000.ordinal # => "1,000ème"

dans ruby vous n'avez pas cette méthode mais vous pouvez ajouter votre propre dans la classe Integer comme ceci.

class Integer
  def ordinalize
    case self%10
    when 1
      return "#{self}er"
    when 2
      return "#{self}ème"
    when 3
      return "#{self}ème"
    else
      return "#{self}ème"
    end
  end
end

22.ordinalize #=> "22ème"

8voto

Chris O'Sullivan Points 251

Je voulais une méthode ordinalize qui donne "premier, deuxième, troisième" plutôt que '1er, 2e, 3e' - donc voici un petit extrait de code qui fonctionne jusqu'à 10 (et qui utilise ordinalize de Rails s'il ne trouve pas la correspondance).

class TextOrdinalize

  def initialize(value)
    @value = value
  end

  def text_ordinalize
    ordinalize_mapping[@value] || @value.ordinalize
  end

  private

  def ordinalize_mapping
    [nil, "premier", "deuxième", "troisième", "quatrième", "cinquième", "sixième", "septième",
      "huitième", "neuvième", "dixième" ]
  end

end

Voici comment cela fonctionne :

TextOrdinalize.new(1).text_ordinalize #=> 'premier'
TextOrdinalize.new(2).text_ordinalize #=> 'deuxième'
TextOrdinalize.new(0).text_ordinalize #=> '0er'
TextOrdinalize.new(100).text_ordinalize #=> '100ème'

7voto

ghostdog74 Points 86060

Que diriez-vous de Linguistique? Ce n'est pas inclus de base. Si vous voulez l'inclure, vous devez le configurer en utilisant des hashs, etc.. Voir aussi des exemples ici

2voto

julianromera Points 401

Si vous n'êtes pas dans Rails, vous pourriez faire

def ordinalize(n)
  return "#{n}th" if (11..13).include?(n % 100)

  case n%10
  when 1; "#{n}st"
  when 2; "#{n}nd"
  when 3; "#{n}rd"
  else    "#{n}th"
  end
end

ordinalize 1
=> "1st"
ordinalize 2
=> "2nd"
ordinalize 11
=> "11th"

0voto

En utilisant le gemme humanize, c'est probablement la façon la plus facile. Mais, oui, ce n'est pas intégré, cependant il n'a qu'une seule dépendance, donc je pense que c'est un choix plutôt bon.

require 'humanize'

2.humanize  => "deux"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X