ทับทิมใช้อักษรตัวพิมพ์ใหญ่ทุกคำแรก


162

ฉันต้องสร้างตัวอักษรแรกของทุกคำเป็นตัวพิมพ์ใหญ่และทำให้ตัวพิมพ์เล็กเหลือ ...

manufacturer.MFA_BRAND.first.upcase

เป็นการตั้งค่าตัวอักษรตัวพิมพ์ใหญ่ตัวแรกเท่านั้น แต่ฉันต้องการสิ่งนี้:

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

คำตอบ:


217

ลองนี้:

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

#=> One Two Three Four

หรือ

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

7
splitจะแบ่งพื้นที่โดยค่าเริ่มต้นเพื่อให้คุณสามารถทำให้มันยิ่งสั้น:'one TWO three foUR'.split.map(&:capitalize).join(' ')
มิสชา

@altee คุณสามารถอธิบาย.map(&:capitalize)หรืออย่างน้อยก็ชี้ไปที่ที่คุณพบในเอกสารหรือไม่ ฉันไม่พบการอ้างอิงถึงสิ่งนั้น นอกจากนี้ข้อตกลงกับ*' 'ส่วนท้ายของข้อมูลโค้ดที่สองคืออะไร
macsplean

6
@macsplean &:methodไวยากรณ์ในmapเป็นวิธีที่รัดกุมเพื่อเรียกวิธีการในแต่ละรายการในอาร์เรย์ จากนั้นคุณสามารถโทรjoinเพื่อเปลี่ยนอาร์เรย์นั้นเป็นสตริงได้ * ' 'เป็นทางเลือกในการโทรเข้าร่วม คุณสามารถคิดว่ามันเป็นการคูณไอเท็มในอาร์เรย์เข้าด้วยกันเพื่อสร้างสตริง
แอนดรู

283

ในราง:

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

ไม่มีราง:

"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 (ActiveSupport ของ load rails เพื่อแก้ไข patch #titleize ให้String)

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

(บางส่วน) การใช้งานสตริงที่จัดการโดย #titleize

  • "เคิร์กดักลาส"
  • "kirk_douglas"
  • "เคิร์กดักลาส"
  • "เคิร์กดักลาส"
  • "เคิร์กดักลาส"

#titleize gotchas

Rails's titleizeจะแปลงสิ่งต่าง ๆ เช่นขีดคั่นและขีดเส้นใต้เป็นช่องว่างและสามารถสร้างผลลัพธ์ที่ไม่คาดคิดอื่น ๆ โดยเฉพาะอย่างยิ่งกับสถานการณ์ที่ต้องพิจารณาตัวพิมพ์เล็กและตัวใหญ่โดย @JamesMcMahon:

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

เพราะมันมีไว้เพื่อจัดการรหัสอูฐใส่:

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

ในการจัดการกับกรณีขอบนี้คุณสามารถล้างสตริงของคุณด้วย#downcaseก่อนที่จะรัน #titleize แน่นอนถ้าคุณทำเช่นนั้นคุณจะลบล้างการแยกคำใด ๆ ของ camelCased:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"

นอกจากนี้ยังมีอัญมณีtitleizeที่ทำงานอย่างดี
zon

6
Titleize ไม่ง่ายอย่างที่คิดเช่น 'hEy LoOK' กลายเป็น 'H Ey Lo Ok'
James McMahon

8
GOTCHA ขนาดใหญ่การกำหนดหัวเรื่องจะลบอักขระบางตัวออกอย่างสมบูรณ์เช่นเส้นประ (-) "who? - me" .titleize => "Who? Me"
pixelearth

@pearthearth สำหรับฉันมันเปลี่ยนขีดกลางทั้งหมดเป็นช่องว่าง
boulder_ruby

37

"hello world".titleize ซึ่งควรส่งออก "Hello World"


เอาต์พุตนี้"One Two Three Fo Ur"ซึ่งแตกต่างจากเอาต์พุตที่ต้องการในกรณีนี้ แต่อาจต้องการในตัวอื่น
Rick Smith

3
นี่ไม่ใช่วิธีทับทิม เป็นวิธีการของ ActiveSupport (Rails) ที่นำมาใช้ใน v2.2.1
Zack Burt

20

ตัวเลือกอื่นคือการใช้ regex และ gsub ซึ่งใช้บล็อก:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)

อันนี้เก็บรักษาเครื่องหมายขีดกลางระหว่างคำ ฯลฯ
Beer Me

3
.gsub(/\b\w/, &:capitalize)รักษาตัวพิมพ์ใหญ่ไว้ในคำเช่น "Jane mcCollins"
3680688

4

String # ใช้อักษรตัวพิมพ์ใหญ่ที่เหลือของสตริงหลังจากอักษรตัวแรก สำหรับชื่ออย่าง "McGee" นั่นเป็นผลลัพธ์ที่ไม่พึงประสงค์ แต่ก็มีประโยชน์บางส่วนในกรณีนี้
Br.Bill

3
"hello world".split.each{|i| i.capitalize!}.join(' ')

1
ไม่มีเหตุผลที่จะใช้ตัวดำเนินการ bang (!) หากคุณไม่ได้ทำงานกับตัวแปร
boulder_ruby

2
@boulder_ruby มันไม่เป็นความจริงเลยที่"ไม่มีเหตุผลที่จะต้องใช้โอเปอเรเตอร์ปังหากคุณไม่ได้ทำงานกับตัวแปร" ค่าส่งคืนของการวนซ้ำของeachบล็อกแต่ละครั้งจะถูกยกเลิก The !กำลังแก้ไขสตริงที่สร้างโดยsplitin-place โดยไม่ต้อง!, capitalizeจะสร้างสตริงทุนใหม่ต่อการทำซ้ำและจากนั้นทันทีทิ้งมัน ผลลัพธ์สุดท้ายจะเป็น"hello world"เช่นเดียวกับสตริงต้นฉบับ ด้วย!, แต่ละสตริงในsplitอาร์เรย์ 'd จะมีการเปลี่ยนแปลงและดังนั้นผลของeachการเป็นอาร์เรย์ของสตริงตัวพิมพ์ใหญ่
user513951

1
mapใช่คุณควรเพียงเพื่อการใช้งาน แฮ็คที่น่าสนใจว่า คะแนน
boulder_ruby

1

หากคุณพยายามใช้อักษรตัวแรกของแต่ละคำให้เป็นตัวพิมพ์ใหญ่คุณสามารถใส่สิ่งนี้ได้:

array_name.map (&: ประโยชน์)


0

ฉันใช้สิ่งนี้เพื่อปัญหาที่คล้ายกัน:

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

นี้จัดการกรณีแปลกต่อไปนี้ฉันเห็นลองคำตอบก่อนหน้านี้:

  • ตัวละครที่ไม่ใช่คำเช่น -
  • อักขระเน้นเสียงทั่วไปในชื่อเช่นé
  • อักขระตัวพิมพ์ใหญ่ที่อยู่ตรงกลางของสตริง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.