2010-09-16 48 views
96

Phương thức upcase tận dụng toàn bộ chuỗi.Viết hoa chữ cái đầu tiên trong ruby ​​

Tôi chỉ cần viết hoa chữ cái đầu tiên.

Ngoài ra, tôi cần hỗ trợ một số ngôn ngữ phổ biến, như tiếng Đức và tiếng Nga.

Tôi làm cách nào?

+3

Lưu ý rằng một số ngôn ngữ có ý tưởng khác nhau về chữ cái đầu tiên được viết hoa. Trong tiếng Ailen, bạn làm những việc như "i mBaile Átha Cliath" ("ở Dublin") - chữ thường 'm', chữ thường 'B'. (Xem http://en.wikipedia.org/wiki/Consonant_mutation#Celtic_languages ​​nếu bạn tò mò về lý do tại sao Ailen sẽ làm điều đó và lý do tại sao nó có ý nghĩa.) –

+2

Và cũng lưu ý rằng #capitalize sẽ viết xuống tất cả các chữ cái mà aren ' t chữ cái đầu tiên ... không phải lúc nào cũng là thứ bạn muốn. '['không gian', 'UFO', 'NASA'] thu thập {| w | w.capitalize} # => ['Dấu cách', 'Ufo', 'Nasa'] ' – Huliax

Trả lời

199

Tùy thuộc vào phiên bản Ruby bạn sử dụng.

của Ruby 2.4 và cao hơn

Nó chỉ hoạt động, như từ this version ruby ​​hỗ trợ lập bản đồ trường hợp Unicode.

"мария".capitalize #=> Мария 

của Ruby 2.3 và thấp hơn

"maria".capitalize #=> "Maria" 
"мария".capitalize #=> мария 

Vấn đề là, nó chỉ không làm những gì bạn muốn nó: nó kết quả đầu ra мария thay vì Мария.

Nếu bạn đang sử dụng Rails có một cách giải quyết đơn giản:

"мария".mb_chars.capitalize.to_s # requires ActiveSupport::Multibyte 

hiện công việc.

Nếu không, bạn sẽ phải cài đặt các unicode đá quý và sử dụng nó như thế này:

require 'unicode' 

Unicode::capitalize("мария") #=> Мария 

Ruby 1,8

Trước hết, hãy chắc chắn để sử dụng mã hóa bình luận kỳ diệu :

#!/usr/bin/env ruby 

puts "мария".capitalize 

cung cấp invalid multibyte char (US-ASCII), trong khi:

#!/usr/bin/env ruby 
#coding: utf-8 

puts "мария".capitalize 

hoạt động không có lỗi, nhưng cũng xem Phần Ruby 2.3 và thấp hơn để viết hoa thực.

+1

Nó hoạt động! Cảm ơn rất nhiều ! – AntonAL

+0

chỉ đăng nhập để bỏ phiếu cho bạn. đồ tốt. –

+8

Lưu ý rằng dường như ''API của tôi là tuyệt vời' .capitalize' sẽ tạo ra 'api của tôi là tuyệt vời' có lẽ là hành vi không mong muốn. Vì vậy, câu trả lời này không thực sự trả lời câu hỏi vì anh ta chỉ muốn chữ cái FIRST chuyển thành chữ hoa và số khác bị ảnh hưởng. –

1

Sử dụng capitalize. Từ số docs:

Trả lại bản sao của đường có ký tự đầu tiên được chuyển thành chữ hoa và phần còn lại thành chữ thường.

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

Chỉ sử dụng dấu chấm than nếu bạn muốn thay đổi chuỗi gốc. – Magnar

+0

* doh * Cảm ơn, đã sửa lỗi của tôi. – jhwist

+5

-1. OP * rõ ràng * đề cập đến văn bản tiếng Đức và tiếng Nga, có nghĩa là các ký tự không phải ASCII. 'String # upcase' (và cũng' String # downcase') chỉ được định nghĩa cho các ký tự ASCII. –

18

Thật không may, máy không thể lật/lật/viết hoa đúng cách. Nó cần quá nhiều thông tin theo ngữ cảnh cho một máy tính để hiểu.

Đó là lý do lớp Ruby chỉ String chỉ hỗ trợ viết hoa cho các ký tự ASCII, vì có ít nhất phần nào là được xác định rõ.

Tôi có ý nghĩa gì với "thông tin theo ngữ cảnh"?

Ví dụ, để tận dụng i đúng cách, bạn cần phải biết ngôn ngữ văn bản bằng tiếng Anh, ví dụ, chỉ có hai i s:. Vốn I mà không có một dấu chấm và nhỏ i với một dấu chấm. Nhưng Thổ Nhĩ Kỳ có bốn số i s: số I không có dấu chấm, số İ có dấu chấm, nhỏ ı không có dấu chấm, nhỏ i bằng dấu chấm. Vì vậy, bằng tiếng Anh 'i'.upcase # => 'I' và bằng tiếng Thổ Nhĩ Kỳ 'i'.upcase # => 'İ'. Nói cách khác: vì 'i'.upcase có thể trả về hai kết quả khác nhau, tùy thuộc vào ngôn ngữ, rõ ràng là không thể viết hoa chính xác từ mà không biết ngôn ngữ của nó.

Nhưng Ruby không biết ngôn ngữ, nó chỉ biết mã hóa. Do đó, không thể viết hoa đúng chuỗi bằng chức năng tích hợp sẵn của Ruby.

Nó trở nên tồi tệ hơn: ngay cả với biết ngôn ngữ, đôi khi không thể viết hoa đúng cách. Ví dụ: bằng tiếng Đức, 'Maße'.upcase # => 'MASSE' (Maße là số nhiều của Maß có nghĩa là đo lường). Tuy nhiên, 'Masse'.upcase # => 'MASSE' (có nghĩa là khối lượng). Vì vậy, 'MASSE'.capitalize là gì? Nói cách khác: viết hoa chính xác yêu cầu trí thông minh nhân tạo đầy đủ. Vì vậy, thay vì đôi khi đưa ra câu trả lời sai, Ruby thỉnh thoảng không trả lời ở tất cả, đó là lý do tại sao các ký tự không phải ASCII bị bỏ qua trong hoạt động viết hoa/viết hoa/viết hoa. (Trong đó tất nhiên cũng đọc kết quả sai, nhưng ít nhất nó dễ dàng để kiểm tra.)

+4

Xin lỗi, nhưng lập luận của bạn không giữ nước. Nó không phải là sự thật rằng Ruby chọn không đưa ra câu trả lời nào cả, Ruby luôn đưa ra câu trả lời, thường là sai - ví dụ: "мария" .upcase không bao giờ nên trả về "мария", điều đó không đúng trong mọi ngữ cảnh. Và sự giải thích của bạn về nhu cầu AI không liên quan chút nào - không có gì ngăn cản upcase làm lại mảng, nói ['I', 'İ'] cho 'i'.upcase, và để người gọi quyết định viết hoa nào có liên quan trong một tình huống nhất định. Hiện tại, việc xử lý chuyển đổi giữa chữ hoa và chữ thường của Ruby bị phá vỡ, và thế là xong. – michau

+2

-1 vì có một thủ đô [Eszett] (https://en.wikipedia.org/wiki/Capital_%E1%BA%9E). Sử dụng một số khu vực không chính thức hoàn toàn không thể phục vụ như là bằng chứng của giải pháp đó là có thể với AI chỉ. – Mike

38

tận dụng chữ cái đầu tiên của từ đầu tiên của chuỗi

"kirk douglas".capitalize 
#=> "Kirk douglas" 

tận dụng chữ cái đầu tiên của mỗi từ

Trong ray:

"kirk douglas".titleize 
=> "Kirk Douglas" 

HOẶC

"kirk_douglas".titleize 
=> "Kirk Douglas"  

Trong ruby:

"kirk douglas".split(/ |\_|\-/).map(&:capitalize).join(" ") 
#=> "Kirk Douglas" 

bên ngoài đường ray, nhưng vẫn muốn sử dụng phương pháp titleize

require 'active_support/core_ext' 
"kirk douglas".titleize #or capitalize 
+2

Lưu ý rằng 'viết hoa' sẽ chỉ hoạt động với các ký tự ASCII. – infused

+1

Upvote cho một giải pháp Ruby thuần túy. Quá lười biếng để kích hoạt Rails phù hợp, và điều này đã làm các trick :) – illbzo1

12

Vâng, chỉ vì vậy chúng tôi biết làm thế nào để tận dụng chỉ chữ cái đầu tiên và để những người còn lại một mình (vì đôi khi đó là điều mong muốn) ...

['NASA', 'MHz', 'sputnik'].collect do |word| 
    letters = word.split('') 
    letters.first.upcase! 
    letters.join 
end 

=> ["NASA", "MHz", "Sputnik"] 

Calling #capitalize sẽ cho kết quả trong ["Nasa", "Mhz", "Sputnik"]

+0

Cảm ơn bạn chỉ là những gì tôi đang tìm kiếm, hữu ích cho việc chuyển đổi các tiêu đề thành 'trường hợp câu' – lux

1

Bạn có thể sử dụng mb_chars.khía cạnh này umlaute:

class String 

    # Only capitalize first letter of a string 
    def capitalize_first 
    self[0] = self[0].mb_chars.upcase 
    self 
    end 

end 

Ví dụ:

"ümlaute".capitalize_first 
#=> "Ümlaute" 
3

Tính đến hỗ trợ tích cực và Rails 5.0.0.beta4 bạn có thể sử dụng một trong hai phương pháp: String#upcase_first hay ActiveSupport::Inflector#upcase_first. Kiểm tra điều này blog post để biết thêm thông tin.

Các vấn đề liên quan