Dizenin yalnızca ilk karakterini büyük harfle yazıp diğerlerini rahat bırak? (Raylar)


102

Rails'in bir dizenin ilk karakterini büyük harfle yazmasını ve diğerlerini olduğu gibi bırakmasını sağlamaya çalışıyorum. "New York'luyum" un "New Yorkluyum" a dönüştüğü bir problemle karşılaşıyorum.

İlk karakteri seçmek için hangi yöntemi kullanırdım?

Teşekkürler

DÜZENLEME: Macek'in önerdiği şeyi uygulamaya çalıştım, ancak "tanımsız bir yöntemden` `büyük harf kullan '' hatası alıyorum. Kod, büyük harf satırı olmadan iyi çalışır. Yardım için teşekkürler!

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

DÜZENLEME 2: Çalışıyor. Yardım için teşekkürler!

DÜZENLEME 3: Bekle, hayır yapmadım ... İşte liste modelimde bulunanlar.

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

DÜZENLEME 4: Macek'in düzenlemesini denedim ve hala tanımlanmamış bir yöntem `` büyük harfle yazılıyor '' hatası alıyorum.Neyi yanlış yapıyor olabilirim?

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

DÜZENLEME 5: Bu garip. Aşağıdaki satırı kullanarak tanımsız yöntem hatasından kurtulabiliyorum. Sorun, ilk harfi bir sayıyla değiştiriyor gibi görünmesidir. Örneğin, yerine aktifleştirilmesi y de You , bu döner y bir 121 içine

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

Göre, EDIT 32. satırı ile başlamalısınız self.title = . Ayrıca, 3 satırın hepsinde, yalnızca (eşittir işaretinin) self.titlesolunda ihtiyacınız vardır =. Diğer yerlerde sadece kullanabilirsiniz title. Bir örnek için cevabımdaki düzenlemeye bakın.
maček

2
Düzenleme4'teki sorun, yalnızca bir karaktere sahip olmanızdır - artık bir dizge değil - bu nedenle, "büyük harfle" dizge işlevini tanımaz.
Taryn East

Düzenleme 5 ile ilgili sorun, başlık [0] 'ın bir düzeltme numarası olmasıdır, bu nedenle [0] .to_s başlığını çağırmak size sadece karakter numarasını verecektir (yani, dizge olarak 121: "121"). İsterseniz self.title [0] = title.first.capitalize yapabilirsiniz!
Nick

Bir #upcase_first_case ekledim ve bir çekme isteği yaptım: github.com/rails/rails/pull/15319 . Geri bildiriminizi oraya eklemekten çekinmeyin.
Aldo 'xoen' Giambelluca

Yanıtlar:


93

Titleize her kelimeyi büyük harfle yazacaktır. Bu çizgi ağır geliyor, ancak değiştirilen tek mektubun ilk harf olduğunu garanti edecek.

new_string = string.slice(0,1).capitalize + string.slice(1..-1)

Güncelleme:

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

Bekle, hala çalışmıyor. Yanlış alarm: / Sanırım yanlış uyguluyorum.
Daniel O'Connor

1
Daniel - sorununuzu çözen bir cevabı "kabul etmek" için genellikle iyi bir biçimdir. Cevabın solundaki "tik" düğmesine tıklayarak bunu yapabilirsiniz. :)
Taryn East

1
Soruyu yanlış anladım, yoksa sana 1 puan vermek istedim. .Capitalize yerine .titleize arıyordum. Yine de teşekkürler Taryn!
Eric Wanchic

OOC - Bu neden sizi olumlu oy vermekten alıkoyuyor? Orijinal posterin sorusuna doğru cevap verdim mi? Öyle düşünüyorsanız - oy verin. Başka hiçbir şeye bağlı olmak zorunda değil ... :)
Taryn East

2
İşte başlıyor: s[0].capitalize + s[1..-1] if s.present?
Alex Escalante

126

Bunu yapmalı:

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

40
Ya da daha kısaca,title[0] = title[0].capitalize
Jon Garvin

Bu çok zarif bir çözüm.
Karew

1
@JonGarvin title [0] .capitalize çalışmıyor (en azından Ruby 1.8.7 ile), çünkü title [0] bir Fixnum döndürüyor ve büyük harf bir dize bekliyor .. bu yüzden bence title.first.capitalize Git.
Nick

2
utanmazsıntitle.first.capitalize!
Adam Waite

1
capitalizeilk harften sonraki tüm harfleri küçük harfe dönüştürür, bu nedenle soruda sunulan dizede çalışmaz ("New York'luyum").
Mark Schneider

57

İnsanlaştırabilirsiniz. Metin satırlarınızda alt çizgilere veya başka büyük harflere ihtiyacınız yoksa.

Giriş:

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

Çıktı:

"I'm from new york..."

7
OP özellikle 'new
york'tan

Hmm gerçekten, cevabımla biraz fazla hızlı.
Bartuzz

17
@Bartuzz OP'nin istediği bu olmasa da, tam olarak aradığım buydu. Teşekkürler!
Yetti

Ancak new york, uygun bir isim olduğu için büyük harf kullanmalıdır.
Shayne

Dikkatli olun humanize, Rails, tam olarak ActiveSupport yöntemidir. Sade yakut bunu yapamaz.
Penguin

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

1
Özlü ve zarif. Bunun en iyi cevap olması gerektiğine inanıyorum.
Chris

Katılıyorum. Bence bu kabul edilen cevap olmalı.
Garry Pettet

Bir tuhaflık, ^satırın başlangıcı anlamına geldiğinden beri "\nfoo"olur "\nFoo". Çoğu kullanım durumu için bu muhtemelen iyidir. A olduğu subve a olmadığı için gsub, çok satırlı dizelerde bile yalnızca bir harf büyük olacak.
Henrik N

str.sub(/\S/, &:upcase)İlk boşluk olmayan karakteri bulan ve onu büyük harfle yazacak olan kullanarak yukarıdaki sınırlamayı alabilir .
Anthony Panozzo

39

İtibariyle Raylar 5.0.0.beta4 yeni kullanabilirsiniz String#upcase_firstyöntem veya ActiveSupport::Inflector#upcase_firstbunu yapmak için. Daha fazla bilgi için bu blog gönderisine bakın.


Bu harika bir haber! Şu anda ne yapabileceğimizi düşünüyordum ve belki Rails 4 için bir polyfill iyi olurdu.
hakunin

Upcase_first'in mb_chars ile bile aksanları / özel karakterleri işlemediğini unutmayın
user3033467

14

Nesne yönelimli bir çözüm:

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

O zaman bunu yapabilirsiniz:

"i'm from New York".capitalize_first_char

En azından biri Stringsınıfın genişlemesi ile zarif bir çözüm yazdı .
Dmitriy

@Dmitriy maymun sicim sınıfını neden zarif yapıyor?
Gerard Simpson


6

Düzenle 2

Sorununuzu çoğaltacak gibi görünmüyorum. Devam edin ve bu yerel Ruby komut dosyasını çalıştırın. Aradığınız kesin çıktıyı üretir ve Rails tüm bu yöntemleri destekler. Ne tür girdilerle sorun yaşıyorsunuz?

#!/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

çıktı

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

Düzenle

Düzenlemenize bağlı olarak, buna benzer bir şey deneyebilirsiniz.

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

Orijinal

Bu hile yapacak

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

String#capitalizeTüm dizede kullanmaya çalışırken I'm from new york, yöntemin:

İlk karakter büyük harfe ve kalanı küçük harfe dönüştürülmüş str'nin bir kopyasını döndürür .

"hello".capitalize    #=> "Hello"
"HELLO".capitalize    #=> "Hello"
"123ABC".capitalize   #=> "123abc"

+1 çünkü bilgisayarımda
deneyene

Merhaba yardımın için teşekkürler. Yine de neyi yanlış yapıyorum? Kodumu içerecek şekilde orijinal soruyu düzenledim.
Daniel O'Connor

Taryn'in önerisini kullandım ve işe yaradı. Yine de yardım için teşekkürler!
Daniel O'Connor

Merhaba, stackoverflow bir düzenleme yaptığınızı söylüyor, ancak ben farklı bir şey görmüyorum?
Daniel O'Connor

6
my_string = "hello, World"
my_string.sub(/\S/, &:upcase) # => "Hello, World"

My_string boşsa başarısız olmaz! Güzel. İhtiyacım olan şey bu.
Huliax

4

Bu yanıtların çoğu dizeyi yerinde düzenler, sadece görünüm çıktısını biçimlendirirken, temel dizeyi değiştirmek istemeyebilirsiniz, böylece a'dan tapsonra dupdüzenlenmiş bir kopya almak için kullanabilirsiniz.

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

3

Sadece ve sadece OP String nesnesine maymun yama yapmak isterse, bu kullanılabilir

class String
  # Only capitalize first letter of a string
  def capitalize_first
    self.sub(/\S/, &:upcase)
  end
end

Şimdi kullan:

"i live in New York".capitalize_first #=> I live in New York

2

Daha da kısa bir versiyon şunlar olabilir:

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

2

Hiç kimse gsub'dan bahsetmedi, bu da bunu kısaca yapmanıza izin veriyor.

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

Misal:

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

1

Belki de en kolay yol.

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

1

Çok baytlı karakterlerle uğraşmanız gerekiyorsa, yani sitenizi uluslararasılaştırmanız gerekiyorsa, s[0] = ...çözümün yeterli olmayacağını unutmayın. Bu Stack Overflow sorusu, unicode kullanım mücevherinin kullanılmasını önerir

Ruby 1.9: Çok baytlı dizeleri nasıl düzgün bir şekilde büyütebilirim?

DÜZENLE

Aslında, en azından garip dize kodlamalarını önlemenin daha kolay bir yolu, yalnızca String # mb_chars kullanmaktır :

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

0

Dizge üzerinde sınıflandırma yöntemi ne olacak?

'somESTRIng'.classify

çıktı:

#rails => 'SomESTRIng'

1
Kelimeleri tekilleştirmek gibi birçok ek şey yapıyor. "hello worlds".classify # => "Hello world"
Pavel Pravosud

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

Öyle görünüyor. Ruby'de yeniyim ve diğer yanıtlar aslında OP'nin sorduğu şeyi yapmadı, bu yüzden işe yaramasını sağladım: D Yanılıyorsam düzelt, ancak AFAIK bir dizeyi [i] değiştirerek değiştirmez birçok dilde mi çalışıyorsunuz?
Jeriko

3
bu Ruby'ye özgü bir sorudur. string[i]Diğer dillerde çalışmaması önemli değil. Lütfen StackOverflow'un bu tür saldırıya uğramış yanıtlardan uzak kalmasına yardımcı olun. String
RTFM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.