我需要将每个单词的第一个字符变成大写,并将其余字符变为小写...
manufacturer.MFA_BRAND.first.upcase
只能将第一个字母大写,但我需要这样:
ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four
"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
不使用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"
#downcase
清理字符串。当然,如果您这样做,将会清除任何驼峰式单词的分隔符:"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
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(' ')
- Mischa.map(&:capitalize)
的含义吗?或者至少告诉我在哪里可以找到相关文档?我找不到任何相关信息。另外,第二段代码末尾的*' '
是什么意思? - macsplean&:method
语法在 map
中的使用是一种简洁的方式,可以对数组中的每个元素调用一个方法。接着你可以调用 join
方法将该数组转换成字符串。* ' '
是另外一种调用 join 的方式。你可以将其理解为将数组中的元素相乘以创建一个字符串。 - Andrew"hello world".titleize
会输出"Hello World"。
另一种选择是使用正则表达式和gsub,它需要一个块:
'one TWO three foUR'.gsub(/\w+/, &:capitalize)
.gsub(/\b\w/, &:capitalize)
可以保留单词内原本的大写格式,例如:"Jane mcCollins"。 - user3680688[[:alpha:]]
而不是 \w
可以使其支持 Unicode。 - Adobe"hello world".split.each{|i| i.capitalize!}.join(' ')
each
块时的返回值都会被丢弃。!
实际上是在原地修改了 split
生成的字符串。如果没有 !
,则 capitalize
会为每个迭代创建一个新的首字母大写的字符串,然后立即将其丢弃。最终结果将是 "hello world"
,与原始字符串完全相同。有了 !
,split
的每个字符串都被更改,因此 each
的结果是一个首字母大写的字符串数组。 - user513951map
。不过这个 hack 很有趣。分数。 - boulder_ruby请查看String#capitalize方法。
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize
array_name.map(&:capitalize)
我曾经用过这个来解决类似的问题:
'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }
这个处理程序解决了我在尝试之前的答案中遇到的以下奇怪情况: