Ruby titleize / convert" los angeles,ca"加州洛杉矶"

时间:2017-09-08 03:32:41

标签: ruby-on-rails ruby string formatting string-formatting

我正在开发一个项目,该项目使用用户输入的位置,我正在寻找有关如何正确标记某个位置的建议,例如" los angeles,ca"。

使用Rails titleize,我得到了" Los Angeles,Ca" (注意Ca中的小写字母a),这是预期的,我想知道为状态获得正确案例的最佳方法是什么(将两个字母都大写)。

最初我考虑过拆分最后一个逗号并将该段的所有字符大写并将其重新组合在一起,我认为在大多数情况下它会正常工作但我确信有一些边缘情况我没有'想到了。

有没有人以前做过这个或有一个好的解决方案?或者,如果split解决方案是最好的选择,那么获得一些反馈意见就很棒了!

3 个答案:

答案 0 :(得分:0)

如何匹配字符串末尾的两个字母代码?您可以匹配任何两个字母代码,它是一个大写字母,后跟一个小写字母:

cities = [
  'Somewhere, Fo',
  'Here, Ba',
  'Los Angeles, Ca',
  'Los Angeles, CA',
  'City,In',
  'City,IN'
]

cities.each do |city|
  puts city.gsub(/([A-Z][a-z])\z/) { |match| match.upcase }
end

或者,如果这只适用于美国各州,并且由于其数量众所周知且有限,您可以直接替换它们。

答案 1 :(得分:0)

a = "Los Angeles, Ca" 我们将在使用transform之后获得:使用输入字段,然后我们可以得到: a.split(",").length将告知它是否包含逗号分隔值,a.split(",")[1].strip.length == 2将在删除空格后判断第二个值是否包含2个字符。

"#{a.split(",")[0]}, #{a.split(",")[1].strip.try(:upcase)}"如果两个条件都正确,这将为我们提供所需的值。

你可以把它写成:

final_value = (a.split(",").length == 2 and a.split(",")[1].strip.length == 2 ? "#{a.split(",")[0]}, #{a.split(",")[1].strip.try(:upcase)}" : a)

if a.split(",").length == 2 and a.split(",")[1].strip.length == 2 final_value = "#{a.split(",")[0]}, #{a.split(",")[1].strip.try(:upcase)}" else final_value = a end

我希望这会有所帮助,虽然这不是一个简洁的解决方案,因为数据不是标准化的。我仍然愿意知道更好的解决方案。

答案 2 :(得分:0)

您可以定义一个模式以匹配状态(不区分大小写):

states = /AL|AK|AZ|AR|CA|CO|CT|and_so_on/i

并使用upcase - d版本替换字符串中的尾随状态:

location = 'los angeles, ca'
location.titleize.sub(/\b#{states}\z/, &:upcase)
#=> "Los Angeles, CA"