web-dev-qa-db-ja.com

文字列の最初の文字のみを大文字にし、他の文字はそのままにしますか? (レール)

私はRailsを取得して、文字列の最初の文字を大文字にし、他のすべての文字をそのままにしようとしています。 「ニューヨーク出身」が「ニューヨーク出身」に変わるという問題に直面しています。

最初の文字を選択するにはどのような方法を使用しますか?

ありがとう

編集: macekが提案したものを実装しようとしましたが、 "undefined method` capitalize '"エラーが発生します。コードは大文字の行がなくても正常に機能します。助けてくれてありがとう!

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の編集を試みましたが、まだundefined method `capitalize '"エラーが発生しました。 ?

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:これは奇妙です。以下の行を使用して、未定義メソッドのエラーを取り除くことができます。問題は、最初の文字を数字に置き換えているように見えることです。たとえば、yYouで大文字にする代わりに、 y121

self.title[0] = title[0].to_s.capitalize
98
Daniel O'Connor

TitleizeはすべてのWordを大文字にします。この行は重々しい感じがしますが、変更される文字は最初の文字のみであることを保証します。

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..."
91
Taryn East

これはそれを行う必要があります:

title = "test test"     
title[0] = title[0].capitalize
puts title # "Test test"
120

Humanizeを使用できます。テキスト行にアンダースコアやその他の大文字が必要ない場合。

入力:

"i'm from New_York...".humanize

出力:

"I'm from new york..."
56
Bartuzz
str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"
45
Lasse Bunk

Rails 5.0.0.beta4 以降、新しいString#upcase_firstmethodまたはActiveSupport::Inflector#upcase_firstを使用して実行できます。詳細は ブログ投稿 をご覧ください。

33
user1519240

オブジェクト指向ソリューション:

class String
  def capitalize_first_char
    self.sub(/^(.)/) { $1.capitalize }
  end
end

次に、これを行うことができます:

"i'm from New York".capitalize_first_char
14
lmanners
str.sub(/./, &:capitalize)
7
emlai
my_string = "hello, World"
my_string.sub(/\S/, &:upcase) # => "Hello, World"
6
rwz

編集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"
6
maček

これらの回答のほとんどは、文字列をその場で編集します。ビュー出力用にフォーマットするだけの場合、基になる文字列を変更したくないので、tapの後にdupを使用して編集済みコピーを取得できます。

'test'.dup.tap { |string| string[0] = string[0].upcase }
4
Paul.s

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
3
JVK

誰も言及していないので、これを簡潔に行うことができます。

string.gsub(/^([a-z])/) { $1.capitalize }

例:

 > 'caps lock must go'.gsub(/^(.)/) { $1.capitalize }
=> "Caps lock must go"
2
mahemoff

さらに短いバージョンは次のとおりです。

s = "i'm from New York..."
s[0] = s.capitalize[0]
2
Saim

マルチバイト文字を扱う必要がある場合、つまりサイトを国際化する必要がある場合、s[0] = ...ソリューションは適切ではないことに注意してください。このスタックオーバーフローの質問では、 nicode-util gem

Ruby 1.9:マルチバイト文字列を正しく大文字小文字に変換するにはどうすればよいですか?

編集

実際、少なくとも奇妙な文字列エンコーディングを避ける簡単な方法は、単に String#mb_chars を使用することです:

s = s.mb_chars
s[0] = s.first.upcase
s.to_s
1
frontendbeauty

おそらく最も簡単な方法です。

s = "test string"
s[0] = s[0].upcase
# => "Test string"
1
Lukas Baliak

Stringのclassifyメソッドはどうですか?

'somESTRIng'.classify

出力:

#Rails => 'SomESTRIng'
0
mArtinko5MB