我有一个包含“IT Professional”或“DB Administrator”等标题的字段。 我想在句子的中间显示这个,所以需要小写。不幸的是,这也缩小了首字母缩略词,我最终得到了“感谢加入其专业人士社区”。
一个好的开始是下面的Grantovich提到的解决方案,即在config/initializers/inflections.rb
中指定我的首字母缩略词:
ActiveSupport::Inflector.inflections do |inflect|
inflect.acronym "IT"
inflect.acronym "DB"
end
走这条路的问题在于,首先,我不想将它们作为解决方案的一部分建议小写,因为它们是标题,应该用大写字母存储。其次,它们已经用大写字母定义,突然把它们放在小写字母上是一个坏主意。
找到解决方案:由于我希望标题出现在句子的中间,因此需要小写,我通过降低标题,构造句子然后在其上调用#humanize来解决它。 Humanize将把句子的第一个字母和任何定义的首字母缩略词大写。
答案 0 :(得分:5)
如果我们假设通过首字母缩略词,你的意思是你的字符串中的任何单词由一行中的2个或更多个大写字母组成,那么你可以这样做:
def smart_case(field)
field.to_s.split(' ').map { |word|
/[A-Z][A-Z]+/.match(word) ? word : word.downcase
}.join(' ')
end
答案 1 :(得分:5)
如果可能,我会将字符串存储为“IT专业人员”,“数据库管理员”等,所有字母除了已缩小的首字母缩略词外。然后,您可以add your acronyms to the inflector并在需要时使用#titleize
转换为标题案例。在边缘情况和代码维护负担方面,这是一个比编写自己的代码来做“选择性下行”更好的解决方案。
答案 2 :(得分:1)
这是一种丑陋的方式,但是:
def format_me(str)
str.downcase!
@acronymn_words = ["IT Professional", "DB Administrator"]
@acronymn_words.each do |a|
if str.include? a.downcase
str.gsub!(a.downcase,a)
end
end
capitalize_next = true
str = str.split.map do |word|
if capitalize_next then word.capitalize! end
capitalize_next = word.end_with?(".","!","?")
word
end.join(" ")
end
除非你知道你正在寻找的确切字符串,否则这将难以维护,但它会根据你请求的项目推出格式正确的句子。
答案 3 :(得分:0)
我会这样做:
do_not_downcase = ["IT", "DB"] # Complete the list with your favourites words
res = ""
str.split(" ").each do |word|
if !do_not_downcase.include? word then
res += word.downcase + " "
else
res += word + " "
end
end
puts res
>welcome IT professionals