【发布时间】:2012-11-11 07:00:34
【问题描述】:
我需要把每个单词的第一个字符变成大写,其余的变成小写...
manufacturer.MFA_BRAND.first.upcase
只设置第一个字母大写,但我需要这个:
ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four
【问题讨论】:
我需要把每个单词的第一个字符变成大写,其余的变成小写...
manufacturer.MFA_BRAND.first.upcase
只设置第一个字母大写,但我需要这个:
ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four
【问题讨论】:
我用这个来解决类似的问题:
'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }
这可以处理我在尝试之前的答案时看到的以下奇怪情况:
【讨论】:
在 Rails 中:
"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'
不带 Rails:
"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"
Rails 的titleize 会将破折号和下划线之类的内容转换为空格,并可能产生其他意想不到的结果,尤其是@JamesMcMahon 指出的区分大小写的情况:
"hEy lOok".titleize #=> "H Ey Lo Ok"
因为它旨在处理驼峰式代码,例如:
"kirkDouglas".titleize #=> "Kirk Douglas"
要处理这种边缘情况,您可以在运行#titleize 之前先使用#downcase 清理您的字符串。当然,如果您这样做,您将消除任何驼峰式分词:
"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
【讨论】:
如果你想将数组中每个单词的首字母大写,你可以简单地这样写:
array_name.map(&:capitalize)
【讨论】:
"hello world".titleize 应该输出“Hello World”。
【讨论】:
"One Two Three Fo Ur" 在这种情况下与所需的输出不同,但在其他情况下可能是所需的。
另一种选择是使用正则表达式和 gsub,它需要一个块:
'one TWO three foUR'.gsub(/\w+/, &:capitalize)
【讨论】:
.gsub(/\b\w/, &:capitalize) 保留单词中的预期大小写,例如“简·麦柯林斯”
[[:alpha:]] 代替\w 使其能够识别Unicode。
试试这个:
puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')
#=> One Two Three Four
或
puts 'one TWO three foUR'.split.map(&:capitalize)*' '
【讨论】:
split 默认会在空间上分割,所以你可以让它更短:'one TWO three foUR'.split.map(&:capitalize).join(' ')
.map(&:capitalize) 或至少指出您在文档中的哪个位置找到它?我找不到任何参考。还有,第二个代码sn-p末尾的*' '是怎么回事?
&:method 语法在map 是一个concise way to call a method on each item in the array。然后,您可以调用 join 将该数组转换为字符串。 * ' ' 是 alternative way to call join。您可以将其视为将数组中的项目相乘以创建一个字符串。
"hello world".split.each{|i| i.capitalize!}.join(' ')
【讨论】:
! 正在就地修改 split 生成的字符串。如果没有!,capitalize 将在每次迭代中创建一个新的大写字符串,然后立即丢弃它。最终结果将是"hello world",与原始字符串相同。使用!,split'd 数组中的每个字符串都在更改,因此each 的结果是一个大写字符串数组。
map。有趣的黑客虽然。积分
查看 String#capitalize 方法。
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize
【讨论】: