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

时间:2010-04-15 15:34:45

标签: ruby-on-rails string capitalization

我正在尝试让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

18 个答案:

答案 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)

编辑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

输出

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