我正在尝试让Rails将字符串的第一个字符大写,并将所有其他字符保留原样。我遇到了“我来自纽约”的问题变成了“我来自纽约”。
我会用什么方法来选择第一个字符?
谢谢
编辑:我试图实现macek建议的内容,但是我得到了一个“undefined method`panggeize'”错误。没有大写行,代码工作正常。谢谢你的帮助!
def fixlistname!
self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...")
self.title[0] = self.title[0].capitalize
errors.add_to_base("Title must start with \"You know you...\"") unless self.title.starts_with? 'You know you'
end
编辑2:搞定了。谢谢你的帮助!
编辑3:等等,不,我没有......这就是我的列表模型中的内容。
def fixlistname!
self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...")
self.title.slice(0,1).capitalize + self.title.slice(1..-1)
errors.add_to_base("Title must start with \"You know you...\"") unless self.title.starts_with? 'You know you'
end
编辑4:尝试了macek的编辑,仍然得到未定义的方法`大写'“错误。我可能做错了什么?
def fixlistname!
self.title = title.lstrip
self.title += '...' unless title.ends_with?('...')
self.title[0] = title[0].capitalize
errors.add_to_base('Title must start with "You know you..."') unless title.starts_with?("You know you")
end
编辑5:这很奇怪。我可以通过使用下面的行来摆脱未定义的方法错误。问题是它似乎用数字替换了第一个字母。例如,不是将 y 中的 y 大写,而是将 y 变为121
self.title[0] = title[0].to_s.capitalize
答案 0 :(得分:120)
这应该这样做:
title = "test test"
title[0] = title[0].capitalize
puts title # "Test test"
答案 1 :(得分:91)
Titleize会将每个单词都大写。 这条线感觉很大,但会保证唯一更改的字母是第一个。
new_string = string.slice(0,1).capitalize + string.slice(1..-1)
更新
irb(main):001:0> string = "i'm from New York..."
=> "i'm from New York..."
irb(main):002:0> new_string = string.slice(0,1).capitalize + string.slice(1..-1)
=> "I'm from New York..."
答案 2 :(得分:55)
你可以使用人性化。 如果您的文本行中不需要下划线或其他大写字母。
输入:
"i'm from New_York...".humanize
输出:
"I'm from new york..."
答案 3 :(得分:43)
str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"
答案 4 :(得分:31)
从Rails 5.0.0.beta4开始,您可以使用新的String#upcase_first
方法或ActiveSupport::Inflector#upcase_first
来执行此操作。请查看此blog post了解详情。
答案 5 :(得分:14)
面向对象的解决方案:
class String
def capitalize_first_char
self.sub(/^(.)/) { $1.capitalize }
end
end
然后你可以这样做:
"i'm from New York".capitalize_first_char
答案 6 :(得分:7)
str.sub(/./, &:capitalize)
答案 7 :(得分:6)
我似乎无法复制你的麻烦。继续运行这个本机Ruby脚本。它生成您正在寻找的确切输出,Rails支持所有这些方法。你遇到什么样的输入?
#!/usr/bin/ruby
def fixlistname(title)
title = title.lstrip
title += '...' unless title =~ /\.{3}$/
title[0] = title[0].capitalize
raise 'Title must start with "You know you..."' unless title =~ /^You know you/
title
end
DATA.each do |title|
puts fixlistname(title)
end
__END__
you know you something WITH dots ...
you know you something WITHOUT the dots
you know you something with LEADING whitespace...
you know you something with whitespace BUT NO DOTS
this generates error because it doesn't start with you know you
You know you something WITH dots ...
You know you something WITHOUT the dots...
You know you something with LEADING whitespace...
You know you something with whitespace BUT NO DOTS...
RuntimeError: Title must start with "You know you..."
根据您的编辑,您可以尝试这样的事情。
def fixlistname!
self.title = title.lstrip
self.title += '...' unless title.ends_with?('...')
self.title[0] = title[0].capitalize
errors.add_to_base('Title must start with "You know you..."') unless title.starts_with?("You know you")
end
这样就可以了解
s = "i'm from New York"
s[0] = s[0].capitalize
#=> I'm from New York
尝试在整个字符串上使用String#capitalize
时,您看到了I'm from new york
因为方法:
返回 str 的副本,第一个字符转换为大写,余数为小写。
"hello".capitalize #=> "Hello"
"HELLO".capitalize #=> "Hello"
"123ABC".capitalize #=> "123abc"
答案 8 :(得分:6)
my_string = "hello, World"
my_string.sub(/\S/, &:upcase) # => "Hello, World"
答案 9 :(得分:4)
大多数答案都会编辑字符串,当您只是为视图输出格式化时,您可能不希望更改基础字符串,以便在tap
之后使用dup
来获取编辑副本
'test'.dup.tap { |string| string[0] = string[0].upcase }
答案 10 :(得分:3)
当且仅当OP想要对String对象进行猴子修补时,可以使用
class String
# Only capitalize first letter of a string
def capitalize_first
self.sub(/\S/, &:upcase)
end
end
现在使用它:
"i live in New York".capitalize_first #=> I live in New York
答案 11 :(得分:2)
没有人提到过gsub,它可以让你简明扼要地做到这一点。
string.gsub(/^([a-z])/) { $1.capitalize }
示例:
> 'caps lock must go'.gsub(/^(.)/) { $1.capitalize }
=> "Caps lock must go"
答案 12 :(得分:2)
更短的版本可能是:
s = "i'm from New York..."
s[0] = s.capitalize[0]
答案 13 :(得分:1)
也许是最简单的方法。
s = "test string"
s[0] = s[0].upcase
# => "Test string"
答案 14 :(得分:1)
请注意,如果您需要处理多字节字符,即如果您必须将您的网站国际化,则s[0] = ...
解决方案将不足够。此Stack Overflow问题建议使用unicode-util gem
Ruby 1.9: how can I properly upcase & downcase multibyte strings?
修改强>
实际上,至少避免使用奇怪的字符串编码更简单的方法就是使用String#mb_chars:
s = s.mb_chars
s[0] = s.first.upcase
s.to_s
答案 15 :(得分:0)
如何对字符串进行分类?
'somESTRIng'.classify
输出:
#rails => 'SomESTRIng'
答案 16 :(得分:0)
从5.2.3版开始的导轨具有upcase_first方法。
例如,"my Test string".upcase_first
将返回My Test string
。
答案 17 :(得分:-3)
string = "i'm from New York"
string.split(/\s+/).each{ |word,i| word.capitalize! unless i > 0 }.join(' ')
# => I'm from New York