簡體   English   中英

如何在 Ruby 中將 1 轉換為“第一”,將 2 轉換為“第二”,依此類推?

[英]How to convert 1 to "first", 2 to "second", and so on, in Ruby?

Ruby 中是否有內置方法來支持這一點?

如果您在 Rails 中,您可以使用ordinalize1轉換為1st22nd ,依此類推。

例子:

1.ordinalize # => "1st"
2.ordinalize # => "2nd"
3.ordinalize # => "3rd"
...
9.ordinalize # => "9th"
...
1000.ordinalize # => "1000th"

如果你想要大量的逗號:

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

在 ruby​​ 中,您沒有此方法,但您可以像這樣在 Integer 類中添加自己的方法。

class Integer
  def ordinalize
    case self%10
    when 1
      return "#{self}st"
    when 2
      return "#{self}nd"
    when 3
      return "#{self}rd"
    else
      return "#{self}th"
    end
  end
end


22.ordinalize #=> "22nd"

語言學怎么樣? 雖然它不是內置的。 如果你想內置,你必須使用散列等設置它。參見這里的例子

我想要一個具有“第一、第二、第三”而不是“第一、第二、第三”的 ordinalize 方法 - 所以這里有一個小片段,最多可以使用 10(如果找不到,則回退到 Rails ordinalize) .

class TextOrdinalize

  def initialize(value)
    @value = value
  end

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

  private

  def ordinalize_mapping
    [nil, "first", "second", "third", "fourth", "fifth", "sixth", "seventh",
      "eighth", "ninth", "tenth" ]
  end

end

這是它的工作原理:

TextOrdinalize.new(1).text_ordinalize #=> 'first'
TextOrdinalize.new(2).text_ordinalize #=> 'second'
TextOrdinalize.new(0).text_ordinalize #=> '0st'
TextOrdinalize.new(100).text_ordinalize #=> '100th'

使用humanize gem,可能是最簡單的方法。 但是,是的,它不是內置的,但是它只有一個依賴項,所以我認為它是一個不錯的選擇..

require 'humanize'

2.humanize  => "two"

如果你不在 Rails 中,你可以這樣做

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM