Ruby viết hoa từng chữ cái đầu tiên


162

Tôi cần tạo ký tự đầu tiên của mỗi chữ hoa và viết hoa chữ thường ...

manufacturer.MFA_BRAND.first.upcase

chỉ đặt chữ hoa đầu tiên, nhưng tôi cần điều này:

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

Câu trả lời:


217

thử cái này:

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

#=> One Two Three Four

hoặc là

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

7
splitsẽ phân chia theo không gian theo mặc định, vì vậy bạn có thể làm cho nó thậm chí ngắn hơn:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa

@waltee Bạn có thể giải thích .map(&:capitalize)hoặc ít nhất là chỉ đến nơi trong tài liệu bạn tìm thấy không? Tôi không thể tìm thấy bất kỳ tài liệu tham khảo đến đó. Ngoài ra, thỏa thuận với *' 'phần cuối của đoạn mã thứ hai là gì?
macsplean

6
@macsplean &:methodcú pháp trong maplà một cách ngắn gọn để gọi một phương thức trên mỗi mục trong mảng . Sau đó, bạn có thể gọi joinđể biến mảng đó thành một chuỗi. Đây * ' 'là một cách khác để gọi tham gia . Bạn có thể nghĩ về nó như nhân các mục trong mảng với nhau để tạo ra một chuỗi.
Andrew

283

Trong đường ray:

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

w / o Đường ray:

"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 (tải ActiveSupport của rails để vá phương thức #titleize thành String)

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

(một số) trường hợp sử dụng chuỗi được xử lý bởi #titleize

  • "kirk douecraft"
  • "kirk_doumund"
  • "kirk-douecraft"
  • "kirkDoumund"
  • "KirkDoumund"

#titleize gotchas

Rails titleizesẽ chuyển đổi những thứ như dấu gạch ngang và dấu gạch dưới thành khoảng trắng và có thể tạo ra kết quả bất ngờ khác, đặc biệt là với các tình huống phân biệt chữ hoa chữ thường được chỉ ra bởi @JamesMcMahon:

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

bởi vì nó có nghĩa là để xử lý mã vỏ lạc đà như:

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

Để xử lý trường hợp cạnh này, trước tiên bạn có thể làm sạch chuỗi của mình #downcasetrước khi chạy #titleize. Tất nhiên, nếu bạn làm điều đó, bạn sẽ xóa sạch mọi phân tách từ lạc đà:

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

Ngoài ra còn có một viên ngọc titleize rằng hoạt động độc đáo.
zhon

6
Tiêu đề không đơn giản như vẻ ngoài của nó, ví dụ 'hEy LoOK' trở thành 'H Ey Lo Ok'
James McMahon

8
HUGE GOTCHA, tiêu đề hóa sẽ loại bỏ hoàn toàn một số ký tự, chẳng hạn như dấu gạch ngang (-). "ai? - tôi" .titleize => "Ai? tôi"
pixelearth

@pixelearth đối với tôi, nó chuyển đổi tất cả các dấu gạch ngang thành các khoảng trắng riêng lẻ.
boulder_ruby

37

"hello world".titleize sẽ xuất ra "Hello World".


Đầu ra "One Two Three Fo Ur"này khác với đầu ra mong muốn trong trường hợp này, nhưng có thể được mong muốn ở những đầu ra khác.
Rick Smith

3
Đây không phải là một phương pháp Ruby; đó là phương pháp ActiveSupport (Rails) được giới thiệu trong v2.2.1
Zack Burt

20

Một tùy chọn khác là sử dụng regex và gsub, trong đó có một khối:

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

Cái này bảo tồn dấu gạch ngang giữa các từ, v.v.
Bia Me

3
.gsub(/\b\w/, &:capitalize)duy trì viết hoa dự định trong các từ, ví dụ: "Jane mcCollins"
user3680688


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

1
không có lý do để sử dụng toán tử bang (!) nếu bạn không làm việc với biến
boulder_ruby

2
@boulder_ruby Không đúng khi "không có lý do gì để sử dụng toán tử bang nếu bạn không làm việc với một biến." Giá trị trả về của mỗi lần lặp của eachkhối đang bị loại bỏ. Việc !sửa đổi các chuỗi được sản xuất splittại chỗ. Nếu không có !, capitalizesẽ tạo ra một chuỗi viết hoa mới trên mỗi lần lặp, và sau đó loại bỏ ngay lập tức. Kết quả cuối cùng sẽ "hello world"giống như chuỗi gốc. Với !, mỗi chuỗi trong splitmảng 'd đang được thay đổi, và do đó, kết quả eachlà một chuỗi các chuỗi viết hoa.
dùng513951

1
Vâng, bạn chỉ cần sử dụng map . Thú vị hack mặc dù. Điểm
boulder_ruby

1

Nếu bạn đang cố gắng viết hoa chữ cái đầu tiên của mỗi từ trong một mảng, bạn có thể chỉ cần đặt chữ này:

mảng_name.map (&: viết hoa)


0

Tôi đã sử dụng điều này cho một vấn đề tương tự:

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

Điều này xử lý các trường hợp kỳ lạ sau đây tôi thấy đã thử các câu trả lời trước:

  • các ký tự không từ như -
  • ký tự có dấu phổ biến trong các tên như é
  • ký tự viết hoa ở giữa chuỗi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.