2

我有一个包含“IT Professional”或“DB Administrator”等标题的字段。我想在句子中间显示这个,所以需要小写。不幸的是,这也降低了首字母缩略词的大小写,我最终得到了“感谢您加入 IT 专业人士社区”。

一个好的开始将是下面格兰托维奇提到的解决方案,即在 中指定我的首字母缩略词config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.acronym "IT"
  inflect.acronym "DB"
end

走这条路的问题在于,首先,我不想将它们存储为小写,因为它们是解决方案的一部分,因为它们是标题,应该用大写字母存储。其次,它们已经被定义为大写,突然将它们变成小写是个坏主意。

找到的解决方案:由于我希望标题出现在句子的中间,因此需要小写,我通过缩小标题、构造句子然后在其上调用#humanize 来解决它。Humanize 会将句子的第一个字母和任何已定义的首字母缩写词大写。

4

4 回答 4

5

如果可能的话,我会将字符串存储为“IT 专业人员”、“数据库管理员”等,所有字母都已被小写。然后,您可以将首字母缩略词添加到变形器中,并#titleize在需要时用于转换为标题大小写。就边缘情况和代码维护负担而言,这比编写自己的代码进行“选择性降级”更好。

于 2013-09-24T17:13:23.630 回答
5

如果我们假设首字母缩略词,您的意思是字符串中的任何单词连续由 2 个或更多大写字母组成,那么您可以执行以下操作:

def smart_case(field)
  field.to_s.split(' ').map { |word|
    /[A-Z][A-Z]+/.match(word) ? word : word.downcase
  }.join(' ')
end
于 2013-09-24T17:02:52.210 回答
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

除非您知道要查找的确切字符串,否则这将很难维护,但它会使用您请求的项目输出格式正确的句子。

于 2013-09-24T17:07:09.250 回答
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
于 2013-09-24T16:57:06.417 回答