175

我需要将每个单词的第一个字符变成大写,其余的变成小写......

manufacturer.MFA_BRAND.first.upcase

只是设置第一个字母大写,但我需要这个:

ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four
4

8 回答 8

308

在 Rails 中:

"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'

不带导轨:

"kirk douglas".split(/ |\_/).map(&:capitalize).join(" ")

#OBJECT IT OUT
def titleize(str)
  str.split(/ |\_/).map(&:capitalize).join(" ")
end

#OR MONKEY PATCH IT
class String  
  def titleize
    self.split(/ |\_/).map(&:capitalize).join(" ")
  end
end

w/o Rails(加载 rails 的 ActiveSupport 以将 #titleize 方法修补到String

require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"

(一些)由#titleize 处理的字符串用例

  • “柯克道格拉斯”
  • “柯克道格拉斯”
  • “柯克道格拉斯”
  • “柯克道格拉斯”
  • “柯克道格拉斯”

#titleize 陷阱

Railstitleize会将破折号和下划线之类的内容转换为空格,并可能产生其他意想不到的结果,尤其是在@JamesMcMahon 指出的区分大小写的情况下:

"hEy lOok".titleize #=> "H Ey Lo Ok"

因为它旨在处理驼峰式代码,例如:

"kirkDouglas".titleize #=> "Kirk Douglas"

要处理这种边缘情况,您可以#downcase在运行#titleize 之前先清理字符串。当然,如果您这样做,您将消除任何驼峰式分词:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
于 2013-02-21T15:11:51.043 回答
226

尝试这个:

puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')

#=> One Two Three Four

或者

puts 'one TWO three foUR'.split.map(&:capitalize)*' '
于 2012-11-22T21:29:03.520 回答
37

"hello world".titleize应该输出“Hello World”。

于 2015-05-11T06:15:33.723 回答
23

另一种选择是使用正则表达式和 gsub,它需要一个块:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)
于 2013-12-16T12:40:06.177 回答
5
"hello world".split.each{|i| i.capitalize!}.join(' ')
于 2012-11-23T03:21:25.990 回答
4

查看 String#capitalize 方法。

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize

于 2012-11-22T21:25:50.543 回答
1

如果您尝试将数组中每个单词的第一个字母大写,您可以简单地输入:

array_name.map(&:大写)

于 2017-11-19T10:57:13.707 回答
0

我用它来解决类似的问题:

'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }

这可以处理我在尝试之前的答案时看到的以下奇怪情况:

  • 非单词字符,例如 -
  • é 等名称中常见的重音字符
  • 字符串中间的大写字符
于 2020-07-08T22:43:13.867 回答