रूबी हर शब्द को पहले अक्षर को बड़ा करती है


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(' ')
मिशा

@ क्वालिटी संभवत: आपको बता सकती है .map(&:capitalize)या कम से कम यह इंगित करने के लिए कि डॉक में आपने इसे कहां पाया है? मुझे इसका कोई संदर्भ नहीं मिल रहा है। इसके अलावा, *' 'दूसरे कोड के स्निपेट के अंत में क्या सौदा है ?
मैक्स्प्लेन

6
@macsplean &:methodमें वाक्य रचना mapएक है संक्षिप्त तरीके सरणी में प्रत्येक आइटम पर एक विधि कॉल करने के । फिर आप joinउस सरणी को स्ट्रिंग में बदलने के लिए कॉल कर सकते हैं । * ' 'एक है वैकल्पिक तरीका में शामिल होने के कॉल करने के लिए । आप इसे एक स्ट्रिंग बनाने के लिए सरणी में आइटम को एक साथ गुणा करने के बारे में सोच सकते हैं।
एंड्रयू

283

रेल में:

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

w / o रेल:

"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 रेल (लोड रेल के ActiveSupport पैच #titleize करने के लिए विधि String)

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

(कुछ) #titleize द्वारा नियंत्रित स्ट्रिंग उपयोग के मामले

  • "किर्क डगलस"
  • "Kirk_douglas"
  • "किर्क डगलस"
  • "KirkDouglas"
  • "KirkDouglas"

#titleize gotchas

रेल की titleizeचीज़ें डैश और अंडरस्कोर जैसी चीज़ों को रिक्त स्थान में बदल देंगी और अन्य अप्रत्याशित परिणाम उत्पन्न कर सकती हैं, खासकर केस-संवेदी स्थितियों के साथ जैसा @JamesMcMahon द्वारा बताया गया है:

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

क्योंकि यह ऊंट-आवरण कोड को संभालने के लिए है जैसे:

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

इस एज केस से निपटने के लिए आप #downcase#titleize चलाने से पहले अपनी स्ट्रिंग को पहले से साफ कर सकते हैं । यदि आप ऐसा करते हैं तो बेशक आप किसी भी ऊँचे शब्द को मिटा देंगे:

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

वहाँ भी एक रत्न है titleize कि अच्छी तरह से काम करता है।
ज़ोन

6
उदाहरण के लिए शीर्षक जितना सरल दिखता है, उतना सरल नहीं है, उदाहरण के लिए 'हाई लुक' 'एच आई लो ओके' बन जाता है
जेम्स मैकमोहन

8
विशाल गोत्र, शीर्षक कुछ पात्रों को पूरी तरह से हटा देगा, जैसे कि डैश (-)। "कौन? - मुझे" .titleize => "कौन? मैं"
Pixearthth

मेरे लिए @pixelearth सभी डैश को अलग-अलग स्थानों में परिवर्तित करता है।
बोल्डर_रुबी

37

"hello world".titleize जो "हैलो वर्ल्ड" का उत्पादन करना चाहिए।


यह आउटपुट "One Two Three Fo Ur"जो इस मामले में वांछित आउटपुट से अलग है, लेकिन दूसरों में वांछित हो सकता है।
रिक स्मिथ

3
यह रूबी विधि नहीं है; यह v2.2.1 में शुरू किया गया एक ActiveSupport (रेल) विधि है
Zack Burt

20

एक अन्य विकल्प एक रेगेक्स और gsub का उपयोग करना है, जो एक ब्लॉक लेता है:

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

यह एक अंतर-शब्द डैश आदि को संरक्षित करता है
बीर मुझे

3
.gsub(/\b\w/, &:capitalize)शब्दों के भीतर अपेक्षित पूंजीकरण को संरक्षित करता है, जैसे "जेन mcCollins"
user3680688

4

स्ट्रिंग # कैपिटलाइज़ विधि में देखें।

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize


स्ट्रिंग # पहले अक्षर के बाद शेष स्ट्रिंग को बड़ा कर देता है। "मैकजी" जैसे नामों के लिए, यह एक अवांछित परिणाम है, लेकिन यह इस मामले में आंशिक रूप से उपयोगी है।
Br.Bill

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

1
यदि आप एक चर के साथ काम नहीं कर रहे हैं, तो धमाके (!) ऑपरेटर का उपयोग करने का कोई कारण नहीं है
boulder_ruby

2
@boulder_ruby यह सच नहीं है कि "यदि आप एक चर के साथ काम नहीं कर रहे हैं तो धमाके के ऑपरेटर का उपयोग करने का कोई कारण नहीं है।" eachब्लॉक के प्रत्येक पुनरावृत्ति का वापसी मूल्य खारिज किया जा रहा है। !द्वारा उत्पादित तार को संशोधित किया गया है splitयथा-स्थान। इसके बिना !, capitalizeप्रति पुनरावृत्ति में एक नया कैपिटलाइज़्ड स्ट्रिंग बनाया जाएगा, और फिर तुरंत इसे छोड़ दिया जाएगा। अंतिम परिणाम "hello world"मूल स्ट्रिंग के समान ही होगा । साथ !, में प्रत्येक स्ट्रिंग split'घ सरणी बदला जा रहा है, और इसलिए का परिणाम eachपूंजीकृत तार की एक सरणी है।
user513951

1
हाँ, आप बस उपयोग करने वाले हैं map। दिलचस्प हैक हालांकि। अंक
boulder_ruby

1

यदि आप एक सरणी में प्रत्येक शब्द के पहले अक्षर को कैपिटल करने की कोशिश कर रहे हैं, तो आप इसे बस डाल सकते हैं:

array_name.map (और: भुनाने)


0

मैंने इसे इसी तरह की समस्या के लिए इस्तेमाल किया है:

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

यह निम्नलिखित अजीब मामलों को संभालता है जिन्हें मैंने पिछले उत्तरों की कोशिश करते हुए देखा था:

  • गैर-शब्द अक्षर जैसे -
  • é जैसे नामों में सामान्य उच्चारण वाले अक्षर
  • स्ट्रिंग के बीच में कैपिटल कैरेक्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.