केवल स्ट्रिंग के पहले चरित्र को कैपिटल करें और दूसरों को अकेला छोड़ दें? (रेल)


102

मैं एक स्ट्रिंग के पहले चरित्र को कैपिटल करने के लिए रेल प्राप्त करने की कोशिश कर रहा हूं, और अन्य सभी को वैसे ही छोड़ देता हूं। मैं एक ऐसी समस्या में भाग रहा हूँ जहाँ "मैं न्यूयॉर्क से हूँ" में बदल जाता है "मैं नए यॉर्क से हूँ।"

पहला चरित्र चुनने के लिए मैं किस विधि का उपयोग करूंगा?

धन्यवाद

संपादित करें: मैंने जो भी सुझाव दिया था, उसे लागू करने की कोशिश की, लेकिन मुझे एक "अपरिभाषित विधि` पूंजीकृत ' त्रुटि मिल रही है । कोड कैपिटल लाइन के बिना ठीक काम करता है। सहायता के लिए धन्यवाद!

def fixlistname!
  self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...")
  self.title[0] = self.title[0].capitalize
  errors.add_to_base("Title must start with \"You know you...\"") unless self.title.starts_with? 'You know you'
end

संपादित 2: यह काम कर रहा है। सहायता के लिए धन्यवाद!

संपादित करें 3: रुको, नहीं मैंने नहीं किया ... यहाँ है कि मैं अपनी सूची मॉडल में क्या है।

def fixlistname!
  self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...")
  self.title.slice(0,1).capitalize + self.title.slice(1..-1)
  errors.add_to_base("Title must start with \"You know you...\"") unless self.title.starts_with?  'You know you'
end

संपादित करें 4: मैस्क के संपादन की कोशिश की, और अभी भी एक अपरिभाषित विधि प्राप्त कर रहा है `पूंजीकरण '" त्रुटि। मैं क्या गलत कर सकता हूं?

def fixlistname!
  self.title = title.lstrip
  self.title += '...' unless title.ends_with?('...')
  self.title[0] = title[0].capitalize
  errors.add_to_base('Title must start with "You know you..."') unless title.starts_with?("You know you")
end

EDIT 5: यह अजीब है। मैं नीचे पंक्ति का उपयोग करके अपरिभाषित विधि त्रुटि से छुटकारा पाने में सक्षम हूं। समस्या यह है कि यह पहले अक्षर को एक नंबर से बदल देता है। उदाहरण के लिए, आप में y को बड़ा करने के बजाय , यह y को 121 में बदल देता है

self.title[0] = title[0].to_s.capitalize

के आधार पर EDIT 3, आपको पंक्ति 2 के साथ शुरू करने की आवश्यकता है self.title = । इसके अलावा, सभी 3 लाइनों पर, आपको केवल self.titleएक =(समान चिह्न) के बाईं ओर की आवश्यकता होती है। अन्य स्थानों पर आप बस उपयोग कर सकते हैंtitle । एक उदाहरण के लिए मेरे उत्तर पर संपादित देखें।
माकक

2
Edit4 में समस्या यह है कि आपको सिर्फ एक चरित्र मिला है - अब कोई स्ट्रिंग नहीं है - इसलिए यह स्ट्रिंग-फ़ंक्शन "कैपिटलाइज़" को पहचान नहीं पाएगा।
टैरिन पूर्व

एडिट 5 के साथ समस्या यह है कि टाइटल [0] एक फिक्सन है, इसलिए टाइटल [0] .to_s आपको केवल कैरेक्टर नंबर (यानी एक स्ट्रिंग के रूप में 121: "121") देगा। यदि आप चाहें, तो आप स्वयं टाइटल [0] = title.first.capitalize कर सकते हैं!
निक

मैंने एक #upcase_first_case जोड़ा और एक पुल अनुरोध किया: github.com/rails/rails/pull/15419 । वहां अपनी प्रतिक्रिया जोड़ने के लिए स्वतंत्र महसूस करें।
एल्डो 'जिओनी' गिएम्बेलुका

जवाबों:


93

शीर्षक प्रत्येक शब्द को बड़ा करेगा। यह पंक्ति भारी महसूस होती है, लेकिन इस बात की गारंटी होगी कि परिवर्तित किया गया एकमात्र अक्षर पहला है।

new_string = string.slice(0,1).capitalize + string.slice(1..-1)

अपडेट करें:

irb(main):001:0> string = "i'm from New York..."
=> "i'm from New York..."
irb(main):002:0> new_string = string.slice(0,1).capitalize + string.slice(1..-1)
=> "I'm from New York..."

रुको, अभी भी काम नहीं कर रहा है। गलत अलार्म: / मुझे लगता है कि मैं इसे गलत तरीके से लागू कर रहा हूं।
डैनियल ओ'कॉनर

1
डैनियल - यह आम तौर पर एक जवाब को "स्वीकार" करने के लिए अच्छा रूप है जो आपकी समस्या को हल करता है। आप उत्तर के बाईं ओर "टिक" पर क्लिक करके ऐसा कर सकते हैं। :)
टैरिन पूर्व

1
मैंने प्रश्न को गलत समझा, अन्यथा मैं आपको 1 अंक देना चाहता था। मैं .capitalize के बजाय .titleize की तलाश कर रहा था। वैसे भी धन्यवाद Taryn!
बजे एरिक वानिक

OOC - यह आपको उत्थान देने से क्यों रोकता है? क्या मैंने मूल पोस्टर के प्रश्न का सही उत्तर दिया है? अगर आप ऐसा सोचते हैं - तो अपवोट करें। इसे किसी और चीज पर निर्भर होने की जरूरत नहीं है ... :)
टैरिन ईस्ट

2
तो, यहाँ यह जाता है: s[0].capitalize + s[1..-1] if s.present?
एलेक्स Escalante

126

यह करना चाहिए:

title = "test test"     
title[0] = title[0].capitalize
puts title # "Test test"

40
या अधिक संक्षेप में,title[0] = title[0].capitalize
जॉन गार्विन

यह एक बहुत ही सुंदर समाधान है।
करेव

1
@JonGarvin शीर्षक [0] .capitalize काम नहीं करता है (कम से कम रूबी 1.8.7 के साथ), शीर्षक के रूप में [0] एक Fixnum लौटाता है, और कैपिटलाइज़ एक स्ट्रिंग की उम्मीद करता है .. इसलिए मुझे लगता है कि शीर्षक.first.capitalize यह तरीका है जाओ।
निक

2
शर्म की बात है आप नहीं कर सकते हैंtitle.first.capitalize!
एडम वेट

1
capitalizeपहले अक्षर के बाद सभी अक्षरों को नीचे करने के लिए कनवर्ट करता है, इसलिए यह प्रश्न में प्रस्तुत स्ट्रिंग के लिए काम नहीं करता है ("मैं न्यूयॉर्क से हूं")।
मार्क श्नाइडर

57

आप मानवीकरण का उपयोग कर सकते हैं। यदि आपको अपनी पाठ पंक्तियों में अंडरस्कोर या अन्य राजधानियों की आवश्यकता नहीं है।

इनपुट:

"i'm from New_York...".humanize

आउटपुट:

"I'm from new york..."

7
ओपी विशेष रूप से 'न्यू यार्क' से बचना चाहते थे
फतमान

हम्म, वास्तव में थोड़ा बहुत तेजी से मेरे जवाब के साथ।
बार्ट्ज़

17
@Bartuzz भले ही यह ओपी नहीं चाहता था, यह वही है जो मैं देख रहा था। धन्यवाद!
यति

न्यू यॉर्क हालांकि एक उचित संज्ञा के रूप में अव्यवस्थित होगा और राजधानियों का उपयोग करना चाहिए।
शायने

सावधान रहें, humanizeरेल है, बिल्कुल ActiveSupport विधि। सादा माणिक ऐसा नहीं कर सकता।
पेंग्विन

51
str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"

1
संक्षिप्त और सुरुचिपूर्ण। मेरा मानना ​​है कि यह शीर्ष उत्तर होना चाहिए।
क्रिस

मैं सहमत हूँ। मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए।
गैरी पेटिट

एक विचित्रता यह है कि जब ^से लाइन की शुरुआत होती है, "\nfoo"बन जाती है "\nFoo"। यह शायद ज्यादातर उपयोग के मामलों के लिए ठीक है। चूंकि यह एक है subऔर एक नहीं है gsub, यह अभी भी केवल एक पत्र को ऊपर उठाएगा, यहां तक ​​कि बहु-तार तार के साथ भी।
हेनरिक एन

का उपयोग करके ऊपर सीमा प्राप्त कर सकते हैं str.sub(/\S/, &:upcase), जो पहले गैर-व्हाट्सएप चरित्र को ढूंढेगा और इसे ऊपर चढ़ेगा।
एंथनी पनोजो

39

रेल 5.0.0.beta4 के रूप में आप नई String#upcase_firstविधि का उपयोग कर सकते हैं या कर सकते हैं ActiveSupport::Inflector#upcase_first। अधिक जानकारी के लिए इस ब्लॉग पोस्ट की जाँच करें ।


यह तो बहुत अच्छी खबर है! मैं सोच रहा था कि हम अभी क्या कर सकते हैं और शायद रेल 4 के लिए एक पॉलीफिल अच्छा होगा।
hakunin

ध्यान दें कि upcase_first और accb / special chars को हैंडल नहीं करता है, यहां तक ​​कि mb_chars के साथ भी
user3033467

14

एक वस्तु उन्मुख समाधान:

class String
  def capitalize_first_char
    self.sub(/^(.)/) { $1.capitalize }
  end
end

तो आप बस यह कर सकते हैं:

"i'm from New York".capitalize_first_char

कम से कम किसी ने Stringवर्ग के विस्तार के साथ सुरुचिपूर्ण समाधान लिखा ।
दिमित्री

@ डैमिट्री क्यों स्ट्रिंग क्लास को बंक कर रहा है एलिगेंट?
जेरार्ड सिम्पसन


6

संपादित करें २

मैं आपकी परेशानी को दोहराने के लिए प्रतीत नहीं हो सकता। आगे बढ़ो और इस देशी रूबी स्क्रिप्ट को चलाएं। यह आपके द्वारा खोजे जाने वाले सटीक आउटपुट को उत्पन्न करता है, और रेल इन सभी तरीकों का समर्थन करता है। आप किस तरह के इनपुट से परेशान हैं?

#!/usr/bin/ruby
def fixlistname(title)
  title = title.lstrip
  title += '...' unless title =~ /\.{3}$/
  title[0] = title[0].capitalize
  raise 'Title must start with "You know you..."' unless title =~ /^You know you/
  title
end

DATA.each do |title|
  puts fixlistname(title)
end

__END__
you know you something WITH dots ...
you know you something WITHOUT the dots
  you know you something with LEADING whitespace...
  you know you something with whitespace BUT NO DOTS
this generates error because it doesn't start with you know you

उत्पादन

You know you something WITH dots ...
You know you something WITHOUT the dots...
You know you something with LEADING whitespace...
You know you something with whitespace BUT NO DOTS...
RuntimeError: Title must start with "You know you..."

संपादित करें

अपने संपादन के आधार पर, आप कुछ इस तरह की कोशिश कर सकते हैं।

def fixlistname!
  self.title = title.lstrip
  self.title += '...' unless title.ends_with?('...')
  self.title[0] = title[0].capitalize
  errors.add_to_base('Title must start with "You know you..."') unless title.starts_with?("You know you")
end

मूल

यह चाल चलेगा

s = "i'm from New York"
s[0] = s[0].capitalize
#=> I'm from New York

String#capitalizeपूरे स्ट्रिंग पर उपयोग करने की कोशिश करते समय , आप देख रहे थे I'm from new yorkक्योंकि विधि:

पहले अक्षर के साथ str की एक प्रति को अपरकेस में और शेष को निचले हिस्से में परिवर्तित करता है।

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

+1 कारण मुझे नहीं लगा कि मैं तब तक काम करूंगा जब तक मैंने इसे अपने पीसी पर आज़माया नहीं :)
जेरिको

हाय, मदद के लिए धन्यवाद। हालांकि मैं क्या गलत कर रहा हूँ? मैंने अपना कोड शामिल करने के लिए मूल प्रश्न संपादित किया है।
डैनियल ओ'कॉनर

मैंने टैरिन के सुझाव का इस्तेमाल किया और इसे काम में लाया। फ़िर भी सहायता के लिए धन्यवाद!
डैनियल ओ'कॉनर

नमस्ते, stackoverflow का कहना है कि आपने एक संपादन किया है, लेकिन मुझे कुछ अलग नहीं दिखता है?
डैनियल ओ'कॉनर


4

इनमें से अधिकांश उत्तर स्ट्रिंग को जगह में संपादित करते हैं, जब आप केवल दृश्य आउटपुट के लिए प्रारूपण करते हैं तो आप अंतर्निहित स्ट्रिंग को बदलना नहीं चाह सकते हैं ताकि आप संपादित प्रतिलिपि प्राप्त करने के tapबाद उपयोग कर सकें।dup

'test'.dup.tap { |string| string[0] = string[0].upcase }

3

अगर और केवल अगर ओपी स्ट्रिंग ऑब्जेक्ट पर बंदर पैचिंग करना चाहते हैं, तो इसका उपयोग किया जा सकता है

class String
  # Only capitalize first letter of a string
  def capitalize_first
    self.sub(/\S/, &:upcase)
  end
end

अब इसका उपयोग करें:

"i live in New York".capitalize_first #=> I live in New York

2

एक छोटा संस्करण भी हो सकता है:

s = "i'm from New York..."
s[0] = s.capitalize[0]

2

नहीं-किसी का उल्लेख किया गया gsub, जो आपको संक्षिप्त रूप से करने देता है।

string.gsub(/^([a-z])/) { $1.capitalize }

उदाहरण:

 > 'caps lock must go'.gsub(/^(.)/) { $1.capitalize }
=> "Caps lock must go"


1

ध्यान दें कि यदि आपको मल्टी-बाइट वर्णों से निपटने की आवश्यकता है, अर्थात यदि आपको अपनी साइट का अंतर्राष्ट्रीयकरण करना है, तो s[0] = ...समाधान पर्याप्त नहीं होगा। यह स्टैक ओवरफ्लो प्रश्न यूनिकोड-यूज़ रत्न का उपयोग करने का सुझाव देता है

रूबी 1.9: मैं मल्टीबीटी स्ट्रिंग्स को ठीक से कैसे ऊपर-नीचे कर सकता हूं?

संपादित करें

वास्तव में कम से कम अजीब स्ट्रिंग एन्कोडिंग से बचने का एक आसान तरीका केवल स्ट्रिंग # mb_chars का उपयोग करना है :

s = s.mb_chars
s[0] = s.first.upcase
s.to_s

0

स्ट्रिंग पर वर्गीकृत विधि के बारे में क्या?

'somESTRIng'.classify

उत्पादन:

#rails => 'SomESTRIng'

1
यह कई अतिरिक्त चीजें कर रहा है, जैसे एकवचन शब्द। "hello worlds".classify # => "Hello world"
पावेल प्रवोसुद

-3
string = "i'm from New York"
string.split(/\s+/).each{ |word,i| word.capitalize! unless i > 0 }.join(' ')
# => I'm from New York

ऐसा लगता है। मैं माणिक के लिए नया हूं, और अन्य उत्तर वास्तव में ओपी ने जो पूछा, वह नहीं किया, इसलिए मैंने यह काम किया: अगर मैं गलत हूं, तो मुझे सही करें, लेकिन AFAIK स्ट्रिंग को बदलकर एक स्ट्रिंग को संशोधित करता है [i] बहुत सारी भाषाओं में काम करते हैं?
जेरिको

3
यह एक रूबी-विशिष्ट प्रश्न है। string[i]अन्य भाषाओं में काम नहीं करने से कोई फर्क नहीं पड़ता । कृपया इस तरह के हैक किए गए उत्तरों के स्टैकऑवरफ्लो को अव्यवस्था मुक्त रखने में मदद करें। हम RTFM नहीं कह सकते हैं, लेकिन डॉक्स पर एक त्वरित नज़र Stringने भी इस तरह के उत्तर से बचने में मदद की है ...
maček
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.