仅将字符串的第一个字符大写并留下其他字符?(导轨)

Dan*_*nor 101 string ruby-on-rails capitalization

我正在尝试让Rails将字符串的第一个字符大写,并将所有其他字符保留为字符串.我遇到了"我来自纽约"的问题变成了"我来自纽约".

我会用什么方法来选择第一个字符?

谢谢

编辑:我试图实现macek建议的,但我得到一个"未定义的方法`大写'"错误.没有大写行,代码工作正常.谢谢您的帮助!

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
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

编辑5:这很奇怪.我可以通过使用下面的行来摆脱未定义的方法错误.问题是它似乎用数字替换了第一个字母.例如,而不是资本的Ÿ,它把Ÿ为121

self.title[0] = title[0].to_s.capitalize
Run Code Online (Sandbox Code Playgroud)

Pas*_*cke 123

这应该这样做:

title = "test test"     
title[0] = title[0].capitalize
puts title # "Test test"
Run Code Online (Sandbox Code Playgroud)

  • 或者更简洁,`title [0] = title [0] .capitalize` (40认同)
  • `capitalize` 将第一个字母之后的所有字母转换为小写,因此它不适用于问题中出现的字符串(“i'm from New York”)。 (3认同)
  • 可惜你不能“ title.first.capitalize!” (2认同)

Tar*_*ast 91

Titleize将把每个单词都化.这条线感觉很大,但会保证唯一的字母改变是第一个.

new_string = string.slice(0,1).capitalize + string.slice(1..-1)
Run Code Online (Sandbox Code Playgroud)

更新:

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..."
Run Code Online (Sandbox Code Playgroud)

  • 所以,这里是:`s[0].capitalize + s[1..-1] if s.present?` (2认同)

Bar*_*uzz 56

你可以使用人性化.如果您的文本行中不需要下划线或其他大写字母.

输入:

"i'm from New_York...".humanize
Run Code Online (Sandbox Code Playgroud)

输出:

"I'm from new york..."
Run Code Online (Sandbox Code Playgroud)

  • @Bartuzz尽管这不是OP想要的,但这正是我想要的.谢谢! (17认同)
  • OP特别想避免'纽约' (6认同)

Las*_*unk 47

str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"
Run Code Online (Sandbox Code Playgroud)

  • 简洁优雅。我相信这应该是最重要的答案。 (2认同)

use*_*240 35

Rails 5.0.0.beta4开始,您可以使用新String#upcase_first方法或ActiveSupport::Inflector#upcase_first执行此操作.查看此博客文章了解更多信息.


lma*_*ers 14

面向对象的解决方案:

class String
  def capitalize_first_char
    self.sub(/^(.)/) { $1.capitalize }
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

"i'm from New York".capitalize_first_char
Run Code Online (Sandbox Code Playgroud)


mač*_*ček 6

编辑2

我似乎无法复制你的麻烦.继续运行这个本机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
Run Code Online (Sandbox Code Playgroud)

产量

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..."
Run Code Online (Sandbox Code Playgroud)

编辑

根据您的编辑,您可以尝试这样的事情.

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
Run Code Online (Sandbox Code Playgroud)

原版的

这样就可以了

s = "i'm from New York"
s[0] = s[0].capitalize
#=> I'm from New York
Run Code Online (Sandbox Code Playgroud)

在尝试使用String#capitalize整个字符串时,您看到的I'm from new york是因为该方法:

返回str的副本,第一个字符转换为大写,余数为小写.

"hello".capitalize    #=> "Hello"
"HELLO".capitalize    #=> "Hello"
"123ABC".capitalize   #=> "123abc"
Run Code Online (Sandbox Code Playgroud)


Pav*_*sud 6

my_string = "hello, World"
my_string.sub(/\S/, &:upcase) # => "Hello, World"
Run Code Online (Sandbox Code Playgroud)