문자열의 첫 문자 만 대문자로하고 나머지는 그대로 두시겠습니까? (울타리)


102

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

편집 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를 (A121)로

self.title[0] = title[0].to_s.capitalize

를 기반으로하여 EDIT 32 행을 self.title = . 또한 세 줄 모두 self.title에서 =(등호) 왼쪽 에만 필요 합니다 . 다른 곳에서는 title. 예제는 내 대답에 대한 편집을 참조하십시오.
maček 2010

2
Edit4의 문제는 더 이상 문자열이 아닌 문자 만 있으므로 문자열 함수 "대문자 화"를 인식하지 못한다는 것입니다.
Taryn East

Edit 5의 문제점은 title [0]이 고정 번호이므로 title [0] .to_s를 호출하면 문자 번호 만 제공됩니다 (예 : 문자열로 121 : "121"). 원한다면 self.title [0] = title.first.capitalize 할 수 있습니다!
Nick

#upcase_first_case를 추가하고 github.com/rails/rails/pull/15319 풀 요청을 했습니다 . 거기에 의견을 추가하십시오.
Aldo 'xoen'Giambelluca

답변:


93

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..."

아직 작동하지 않습니다. 허위 경보 : / 나는 단지 그것을 잘못 구현하고 있다고 생각합니다.
Daniel O'Connor

1
Daniel-일반적으로 문제를 해결 한 답변을 "수락"하는 것이 좋습니다. 답변 왼쪽에있는 "틱"을 클릭하면됩니다. :)
Taryn East 2011

1
나는 질문을 오해했다. 그렇지 않으면 나는 당신에게 1 점을주고 싶었다. .capitalize 대신 .titleize를 찾고있었습니다. 어쨌든 Taryn 감사합니다!
Eric Wanchic 2014 년

OOC-이로 인해 찬성 투표가 중단되는 이유는 무엇입니까? 원래 포스터의 질문에 올바르게 대답 했습니까? 그렇게 생각하면 찬성합니다. 그것은 무엇에 의존 할 필요가 없습니다 ... :)
타린 이스트에게

2
그래서, 여기 간다 : s[0].capitalize + s[1..-1] if s.present?
알렉스 에스 칼란

126

이렇게해야합니다.

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

40
또는 더 간결하게title[0] = title[0].capitalize
Jon Garvin

이것은 매우 우아한 솔루션입니다.
Karew 2012

1
@JonGarvin title [0] .capitalize는 (적어도 Ruby 1.8.7에서는) 작동하지 않습니다. title [0]은 Fixnum을 반환하고 capitalize는 문자열을 기대합니다 .. 그래서 title.first.capitalize가 방법이라고 생각합니다. 가다.
Nick

2
당신이 할 수없는 수치title.first.capitalize!
아담 웨이트

1
capitalize첫 번째 문자 뒤의 모든 문자를 소문자로 변환하므로 질문에 제시된 문자열 ( "i 'm from New York")에는 작동하지 않습니다.
Mark Schneider

57

Humanize를 사용할 수 있습니다. 텍스트 줄에 밑줄이나 기타 대문자가 필요하지 않은 경우.

입력:

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

산출:

"I'm from new york..."

7
OP는 특히 '뉴욕'을 피하고 싶었습니다
phatmann

흠, 내 대답에 너무 빠르다.
Bartuzz 2013 년

17
@Bartuzz 이것이 OP가 원하는 것이 아니지만 이것이 정확히 내가 찾던 것입니다. 감사!
Yetti

그러나 뉴욕은 고유 명사로서 문법적이지 않으며 대문자를 사용해야합니다.
Shayne

경고 humanize는 Rails, 정확히 ActiveSupport 방법입니다. 일반 루비는 그렇게 할 수 없습니다.
Penguin

51
str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"

1
간결하고 우아합니다. 나는 이것이 최고의 대답이라고 믿습니다.
Chris

나는 동의한다. 나는 이것이 받아 들여진 대답이어야한다고 생각한다.
Garry Pettet 2010 년

하나의 특질은 이후 있다는 것이다 ^수단이 라인의 시작 "\nfoo"이된다 "\nFoo". 대부분의 사용 사례에서는 괜찮습니다. a sub가 아니고 a가 아니기 때문에 여러 gsub줄 문자열을 사용하더라도 여전히 하나의 문자 만 대문자로 표시됩니다.
Henrik N

를 사용하여 위의 제한을 얻을 수 str.sub(/\S/, &:upcase)있습니다. 이것은 공백이 아닌 첫 번째 문자를 찾아 대문자로 만듭니다.
Anthony Panozzo

39

현재 레일 5.0.0.beta4 새 사용할 수있는 String#upcase_first방법을 또는 ActiveSupport::Inflector#upcase_first그것을 할 수 있습니다. 자세한 내용은이 블로그 게시물 을 확인하세요 .


좋은 소식입니다! 지금 당장 할 수있는 일을 생각하고 있었는데 Rails 4 용 polyfill이 좋을 것 같습니다.
hakunin

upcase_first와도 mb_chars와 악센트 / 특수 문자, 처리하지 않습니다
user3033467

14

객체 지향 솔루션 :

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

그런 다음 이렇게 할 수 있습니다.

"i'm from New York".capitalize_first_char

적어도 누군가는 String클래스 확장으로 우아한 솔루션을 작성했습니다 .
Dmitriy 2013 년

@Dmitriy 원숭이가 문자열 클래스를 우아하게 패치하는 이유는 무엇입니까?
Gerard Simpson


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"

1 원인 난 : 내 PC에 그것을 시도까지 문제가 해결 것이라고 생각하지 않았다
Jeriko

안녕하세요, 도와 주셔서 감사합니다. 그래도 내가 뭘 잘못하고 있니? 내 코드를 포함하도록 원래 질문을 편집했습니다.
Daniel O'Connor

나는 Taryn의 제안을 사용했고 그것을 작동시켰다. 그래도 도와 ​​주셔서 감사합니다!
Daniel O'Connor

안녕, stackoverflow는 당신이 편집했다고 말했지만 다른 것이 보이지 않습니까?
Daniel O'Connor


4

이 답변의 대부분은 문자열을 제자리에서 편집합니다.보기 출력을 위해 형식을 지정할 때 기본 문자열을 변경하지 않을 수 있으므로 편집 된 사본을 얻기 위해 tapa 후에 사용할 수 있습니다.dup

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

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

2

더 짧은 버전은 다음과 같습니다.

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

2

아무도 gsub에 대해 언급하지 않았으므로 간결하게 수행 할 수 있습니다.

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

예:

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

1

아마도 가장 쉬운 방법 일 것입니다.

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

1

멀티 바이트 문자를 처리해야하는 경우, 즉 사이트를 국제화해야하는 경우 s[0] = ...솔루션이 적절하지 않습니다. 이 스택 오버플로 질문은 unicode-util gem 사용을 제안합니다.

Ruby 1.9 : 멀티 바이트 문자열을 올바르게 업 케이스 및 다운 케이스하려면 어떻게해야합니까?

편집하다

실제로 이상한 문자열 인코딩을 피하는 더 쉬운 방법은 String # mb_chars를 사용하는 것입니다 .

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

0

문자열에 대한 분류 방법은 어떻습니까?

'somESTRIng'.classify

산출:

#rails => 'SomESTRIng'

1
단어 단 수화와 같은 많은 추가 작업을 수행합니다. "hello worlds".classify # => "Hello world"
Pavel Pravosud 2014 년

-3
string = "i'm from New York"
string.split(/\s+/).each{ |word,i| word.capitalize! unless i > 0 }.join(' ')
# => I'm from New York

그런 것 같아. 나는 루비를 처음 사용하고 다른 답변은 실제로 OP가 요청한 것을 수행하지 않았으므로 작동하도록 만들었습니다. : D 내가 틀렸다면 수정하지만 문자열을 변경하여 문자열을 수정하는 AFAIK [i]는 그렇지 않습니다. 많은 언어로 작업합니까?
Jeriko 2010

3
이것은 루비와 관련된 질문입니다. string[i]다른 언어로 작동 하지 않더라도 상관 없습니다. 이러한 종류의 해킹 된 답변에 대해 StackOverflow가 깔끔하게 유지되도록 도와주세요. 우리는 RTFM을 말할 수는 없지만, 심지어 빠른 상기 한 눈에 String... 문서는 피할이 같은 대답을 도왔 것
maček
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.