Ruby menggunakan huruf kapital setiap kata pertama

162

Saya perlu membuat karakter pertama dari setiap huruf besar, dan membuat huruf kecil lainnya ...

manufacturer.MFA_BRAND.first.upcase

hanya mengatur huruf besar pertama, tetapi saya perlu ini:

ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four
byCoder
sumber

Jawaban:

217

coba ini:

puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')

#=> One Two Three Four

atau

puts 'one TWO three foUR'.split.map(&:capitalize)*' '

sumber
7
splitakan terpecah pada ruang secara default, sehingga Anda dapat membuatnya lebih pendek:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa
@waltee Bisakah Anda menjelaskan .map(&:capitalize)atau setidaknya menunjuk ke tempat di mana Anda menemukannya? Saya tidak dapat menemukan referensi untuk itu. Juga, apa masalahnya dengan *' 'di akhir cuplikan kode kedua?
macsplean
6
@macsplean &:methodsintaks dalam mapadalah cara ringkas untuk memanggil metode pada setiap item dalam array . Anda kemudian dapat memanggil joinuntuk mengubah array itu menjadi string. Ini * ' 'adalah cara alternatif untuk memanggil gabung . Anda bisa menganggapnya sebagai mengalikan item dalam array bersama-sama untuk membuat string.
Andrew
283

Dalam Rails:

"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'

tanpa rel:

"kirk douglas".split(/ |\_/).map(&:capitalize).join(" ")

#OBJECT IT OUT
def titleize(str)
  str.split(/ |\_/).map(&:capitalize).join(" ")
end

#OR MONKEY PATCH IT
class String  
  def titleize
    self.split(/ |\_/).map(&:capitalize).join(" ")
  end
end

w / o Rails (memuat ActiveSupport rel untuk mem-patch metode #titleize ke String)

require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"

(beberapa) kasus penggunaan string ditangani oleh #titleize

  • "kirk douglas"
  • "kirk_douglas"
  • "kirk-douglas"
  • "kirkDouglas"
  • "KirkDouglas"

#titleize gotchas

Rails titleizeakan mengubah hal-hal seperti tanda hubung dan garis bawah menjadi spasi dan dapat menghasilkan hasil tak terduga lainnya, terutama dengan situasi case-sensitive seperti yang ditunjukkan oleh @JamesMcMahon:

"hEy lOok".titleize #=> "H Ey Lo Ok"

karena ini dimaksudkan untuk menangani kode cased camel seperti:

"kirkDouglas".titleize #=> "Kirk Douglas"

Untuk menangani casing tepi ini, Anda dapat membersihkan string Anda #downcaseterlebih dahulu sebelum menjalankan #titleize. Tentu saja jika Anda melakukannya, Anda akan menghapus setiap pemisahan kata camelCased:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
boulder_ruby
sumber
Ada juga permata yang memberi judul yang berfungsi dengan baik.
zhon
6
Beri judul tidak sesederhana kelihatannya, misalnya 'hEy LoOK' menjadi 'H Ey Lo Ok'
James McMahon
8
HUOT GOTCHA, memberi judul akan menghapus karakter tertentu sepenuhnya, seperti tanda hubung (-). "who? - me" .titleize => "Who? Me"
pixelearth
@ Pixixarth bagi saya yang mengubah semua tanda hubung ke ruang individu.
boulder_ruby
37

"hello world".titleize yang seharusnya menampilkan "Hello World".

tint lwin lwin win
sumber
Output ini "One Two Three Fo Ur"yang berbeda dari output yang diinginkan dalam hal ini, tetapi mungkin diinginkan pada yang lain.
Rick Smith
3
Ini bukan metode Ruby; ini merupakan metode ActiveSupport (Rails) yang diperkenalkan di v2.2.1
Zack Burt
20

Pilihan lain adalah menggunakan regex dan gsub, yang membutuhkan blok:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)
Bob Nadler
sumber
Yang ini mempertahankan tanda hubung antar kata, dll.
Beer Me
3
.gsub(/\b\w/, &:capitalize)mempertahankan kapitalisasi yang dimaksudkan dalam kata-kata, misalnya "Jane mcCollins"
user3680688
3
"hello world".split.each{|i| i.capitalize!}.join(' ')
Muhamamd Awais
sumber
1
tidak ada alasan untuk menggunakan operator bang (!) jika Anda tidak bekerja dengan variabel
boulder_ruby
2
@ boulder_ruby Tidak benar bahwa "tidak ada alasan untuk menggunakan operator bang jika Anda tidak bekerja dengan variabel." Nilai kembalinya setiap iterasi eachblok sedang dibuang. The !memodifikasi string yang diproduksi oleh splitin-place. Tanpa itu !, capitalizeakan membuat satu string kapital baru per iterasi, dan kemudian segera membuangnya. Hasil akhirnya akan "hello world", sama seperti string asli. Dengan !, setiap string dalam splitarray sedang diubah, dan oleh karena itu hasilnya eachadalah array dari string kapital.
user513951
1
Ya, Anda seharusnya menggunakannya map. Retas yang menarik. Poin
boulder_ruby
1

Jika Anda mencoba menggunakan huruf kapital untuk huruf pertama dari setiap kata dalam sebuah array, Anda cukup menuliskannya:

array_name.map (&: capitalize)

astee
sumber
0

Saya menggunakan ini untuk masalah yang sama:

'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }

Ini menangani kasus aneh berikut yang saya lihat mencoba jawaban sebelumnya:

  • karakter bukan kata seperti -
  • aksen karakter yang umum dalam nama-nama seperti é
  • huruf kapital di tengah string
sesquipedalian-dev
sumber