私は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:これは奇妙です。以下の行を使用して、未定義メソッドのエラーを取り除くことができます。問題は、最初の文字を数字に置き換えているように見えることです。たとえば、yをYouで大文字にする代わりに、 y121
self.title[0] = title[0].to_s.capitalize
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..."
これはそれを行う必要があります:
title = "test test"
title[0] = title[0].capitalize
puts title # "Test test"
Humanizeを使用できます。テキスト行にアンダースコアやその他の大文字が必要ない場合。
入力:
"i'm from New_York...".humanize
出力:
"I'm from new york..."
str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"
Rails 5.0.0.beta4 以降、新しいString#upcase_first
methodまたはActiveSupport::Inflector#upcase_first
を使用して実行できます。詳細は ブログ投稿 をご覧ください。
オブジェクト指向ソリューション:
class String
def capitalize_first_char
self.sub(/^(.)/) { $1.capitalize }
end
end
次に、これを行うことができます:
"i'm from New York".capitalize_first_char
str.sub(/./, &:capitalize)
my_string = "hello, World"
my_string.sub(/\S/, &:upcase) # => "Hello, World"
あなたのトラブルを再現することはできません。先に進み、このネイティブ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"
これらの回答のほとんどは、文字列をその場で編集します。ビュー出力用にフォーマットするだけの場合、基になる文字列を変更したくないので、tap
の後にdup
を使用して編集済みコピーを取得できます。
'test'.dup.tap { |string| string[0] = string[0].upcase }
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
誰も言及していないので、これを簡潔に行うことができます。
string.gsub(/^([a-z])/) { $1.capitalize }
例:
> 'caps lock must go'.gsub(/^(.)/) { $1.capitalize }
=> "Caps lock must go"
さらに短いバージョンは次のとおりです。
s = "i'm from New York..."
s[0] = s.capitalize[0]
マルチバイト文字を扱う必要がある場合、つまりサイトを国際化する必要がある場合、s[0] = ...
ソリューションは適切ではないことに注意してください。このスタックオーバーフローの質問では、 nicode-util gem
Ruby 1.9:マルチバイト文字列を正しく大文字小文字に変換するにはどうすればよいですか?
編集
実際、少なくとも奇妙な文字列エンコーディングを避ける簡単な方法は、単に String#mb_chars を使用することです:
s = s.mb_chars
s[0] = s.first.upcase
s.to_s
おそらく最も簡単な方法です。
s = "test string"
s[0] = s[0].upcase
# => "Test string"
Stringのclassifyメソッドはどうですか?
'somESTRIng'.classify
出力:
#Rails => 'SomESTRIng'