কেবল স্ট্রিংয়ের প্রথম চরিত্রকে বড় করুন এবং অন্যকে একা রেখে যান? (পাগল)


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: ম্যাসেকের সম্পাদনা করার চেষ্টা করা হয়েছে, এবং এখনও একটি অপ परिभाषित পদ্ধতি পেয়েছে `মূলধন '" ত্রুটি I আমি কী ভুল করতে পারি?

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

সম্পাদনা 5: এটি অদ্ভুত। আমি নীচের লাইনটি ব্যবহার করে অপরিজ্ঞাত পদ্ধতি ত্রুটি থেকে মুক্তি পেতে সক্ষম। সমস্যাটি হ'ল এটি মনে হয় যে এটি প্রথম সংখ্যাটি একটি সংখ্যার সাথে প্রতিস্থাপন করবে। উদাহরণ হিসেবে বলা যায়, এর পরিবর্তে ভিত্তি এর Y মধ্যে আপনি , এটা দেখা যাচ্ছে Y একটি 121 মধ্যে

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

ভিত্তিক EDIT 3, আপনার সাথে লাইন 2 শুরু করা দরকার self.title = । এছাড়াও, সমস্ত 3 লাইনে আপনার কেবল self.titleএকটি =(সমান চিহ্ন) এর বাম দিকে প্রয়োজন । অন্যান্য জায়গায় আপনি কেবল ব্যবহার করতে পারেন title। উদাহরণ হিসাবে আমার উত্তরের সম্পাদনা দেখুন।
maček

2
সম্পাদনা 4-এ সমস্যাটি হ'ল আপনি কেবল একটি চরিত্র পেয়েছেন - আর স্ট্রিং নেই - সুতরাং এটি স্ট্রিং-ফাংশনটিকে "মূলধন" স্বীকৃতি দেবে না।
তারিন পূর্ব

সম্পাদনা 5 এর ক্ষেত্রে সমস্যাটি হ'ল শিরোনাম [0] একটি ফিক্সনাম, সুতরাং শিরোনাম [0]। আপনি নিজেরাই চাইলে টাইটেল [0] = শিরোনাম.ফার্স.প্যাপিটাইলাইজ করতে পারেন!
নিক

আমি একটি #upcase_first_case জুড়েছে এবং খিঁচ অনুরোধ করেছে: github.com/rails/rails/pull/15319 । আপনার মতামত সেখানে নির্দ্বিধায় যোগ করুন।
অ্যালডো 'xoen' গিয়ামেলুচা

উত্তর:


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
ড্যানিয়েল - আপনার সমস্যার সমাধান করে এমন একটি উত্তর "গ্রহণ" করা ভাল form আপনি উত্তরের বাম দিকে "টিক" ক্লিক করে এটি করতে পারেন। :)
তারিন পূর্ব

1
আমি প্রশ্নটি ভুল বুঝেছি, অন্যথায় আমি আপনাকে একটি আপ দিতে চেয়েছিলাম। আমি। ক্যাপিটালাইজের পরিবর্তে .titleize খুঁজছিলাম। ধন্যবাদ যাই হোক তারিন!
এরিক ওয়াঞ্চিক

ওওসি - কেন এটি আপনাকে আপত্তি জানাতে বাধা দেয়? আমি কি মূল পোস্টারের প্রশ্নের সঠিক উত্তর দিয়েছি? আপনি যদি তাই মনে করেন - তাহলে upvote। এটি অন্য কোনও কিছুর উপর নির্ভর করতে হবে না ... :)
তারিন ইস্ট

2
সুতরাং, এখানে এটি যায়: s[0].capitalize + s[1..-1] if s.present?
অ্যালেক্স এসকালান্ট

126

এটি করা উচিত:

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

40
বা আরও সংক্ষেপে,title[0] = title[0].capitalize
জন গারভিন

এটি একটি খুব মার্জিত সমাধান।
কারেউ

1
@ জোনগারভিন শিরোনাম [0]। ক্যাপিটালাইজ কাজ করে না (কমপক্ষে রুবি ১.৮..7 সহ) শিরোনাম [0] যেমন একটি ফিক্সনাম দেয় এবং ক্যাপিটালাইজ একটি স্ট্রিং প্রত্যাশা করে .. সুতরাং আমার মনে হয় শিরোনাম.ফার্স.সি.পিটিজাইজ করার উপায় যাওয়া.
নিক

2
লজ্জা আপনি পারবেন নাtitle.first.capitalize!
অ্যাডাম ওয়েট

1
capitalizeপ্রথম অক্ষরের পরে সমস্ত অক্ষর ছোট হাতের মধ্যে রূপান্তর করে, সুতরাং এটি প্রশ্নের ("আমি নিউ ইয়র্ক থেকে এসেছি") উপস্থাপিত স্ট্রিংয়ের জন্য কাজ করে না।
মার্ক স্নাইডার

57

আপনি মানবিক ব্যবহার করতে পারেন। আপনার পাঠ্য লাইনে যদি আন্ডারস্কোর বা অন্যান্য মূলধনগুলির প্রয়োজন না হয়।

ইনপুট:

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

আউটপুট:

"I'm from new york..."

7
ওপি বিশেষত 'নিউ ইয়র্ক' এড়াতে চেয়েছিল
ফাতেমন

হুম, আমার উত্তরটি দিয়ে খুব দ্রুত bit
বার্তুজ্জ

17
@ বার্টুজ যদিও ওপি এটি চেয়েছিল তা না হলেও আমি যা খুঁজছিলাম ঠিক এটি এটিই ছিল। ধন্যবাদ!
তবুও

নিউ ইয়র্ক তবে এটি যথাযথ বিশেষ্য হিসাবে ungrammatical হবে এবং রাজধানী ব্যবহার করা উচিত।
শায়নে

সতর্কতা অবলম্বন করা উচিত, humanizeএটিই কি রেলস, ঠিক অ্যাক্টিভসপোর্ট পদ্ধতি ort সরল রুবি তা করতে পারে না।
পেঙ্গুইন

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 রেলগুলির জন্য একটি পলিফিল সুন্দর হবে।
হাকুনিন

মনে রাখবেন যে আপসেস_ফার্স্ট এবং অ্যাকসেন্টগুলি / বিশেষ অক্ষরগুলি পরিচালনা করে না, এমনকি এমবি_চার্স সহ
ব্যবহারকারী 3033467

14

একটি অবজেক্ট ওরিয়েন্টেড সমাধান:

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

তারপরে আপনি কেবল এটি করতে পারেন:

"i'm from New York".capitalize_first_char

কমপক্ষে কেউ Stringক্লাস বাড়ানোর সাথে মার্জিত সমাধান লিখেছেন ।
দিমিত্রি

@ দিমিত্রি কেন বাঁদর স্ট্রিং ক্লাসকে মার্জিত করছে?
জেরার্ড সিম্পসন


6

সম্পাদনা 2

আমি আপনার সমস্যার প্রতিলিপি বলে মনে করতে পারি না। এগিয়ে যান এবং এই নেটিভ রুবি স্ক্রিপ্ট চালান। এটি আপনার সন্ধানের সঠিক আউটপুট তৈরি করে এবং রেলগুলি এই সমস্ত পদ্ধতির সমর্থন করে। কোন ধরণের ইনপুটগুলি নিয়ে আপনার সমস্যা হচ্ছে?

#!/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কারণ পদ্ধতি:

বড় অক্ষরে রূপান্তরিত প্রথম অক্ষর এবং বাকীটি ছোট হাতের অক্ষরে রূপান্তর করে স্ট্রের অনুলিপি প্রদান করে ।

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

+1 কারণ আমি আমার পিসিতে চেষ্টা না করা পর্যন্ত এটি কাজ করবে বলে মনে করি না :)
জেরিকো

হাই, সাহায্যের জন্য ধন্যবাদ। আমি কি ভুল করছি যদিও? আমি আমার কোড অন্তর্ভুক্ত করতে মূল প্রশ্নটি সম্পাদনা করেছি।
ড্যানিয়েল ও'কনোর

আমি তারিনের পরামর্শ ব্যবহার করেছি এবং এটি কার্যকর হয়েছি। তবুও সাহায্যের জন্য ধন্যবাদ!
ড্যানিয়েল ও'কনোর

হাই, স্ট্যাকওভারফ্লো বলছে আপনি একটি সম্পাদনা করেছেন, তবে আমি আলাদা কিছু দেখছি না?
ড্যানিয়েল ও'কনোর


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

কারও উল্লিখিত জিসব নয়, এটি আপনাকে সংক্ষিপ্তভাবে এটি করতে দেয়।

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

উদাহরণ:

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


1

নোট করুন যে আপনার যদি মাল্টি-বাইট অক্ষরগুলির সাথে ডিল করতে হয়, অর্থাত্ আপনার যদি নিজের সাইটটিকে আন্তর্জাতিকীকরণ করতে হয় তবে s[0] = ...সমাধানটি পর্যাপ্ত হবে না। এই স্ট্যাক ওভারফ্লো প্রশ্নটি ইউনিকোড- ব্যবহার রত্নটি ব্যবহার করার পরামর্শ দেয়

রুবি ১.৯: আমি কীভাবে মাল্টিবাইট স্ট্রিংগুলি সঠিকভাবে আপস এবং ডাউনসেস করতে পারি?

সম্পাদনা

আসলে কমপক্ষে অদ্ভুত স্ট্রিং এনকোডিংগুলি এড়ানোর সহজ উপায় হ'ল স্ট্রিং # এমবি_চার্স ব্যবহার করা :

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

তাই মনে হয়. আমি রুবিতে নতুন, এবং অন্যান্য উত্তরগুলি আসলে ওপি যা বলেছিল তা করেনি, তাই আমি এটি কাজ করে দিয়েছিলাম: ডি আমি ভুল হলে আমাকে সংশোধন করুন, তবে আফ্রিক স্ট্রিং পরিবর্তন করে একটি স্ট্রিং পরিবর্তন করছে [i] না অনেক ভাষায় কাজ?
জেরিকো

3
এটি একটি রুবি-নির্দিষ্ট প্রশ্ন। এটা কোন ব্যাপার না যদি string[i]অন্য ভাষায় কাজ করে না। দয়া করে এই জাতীয় হ্যাক-আপ উত্তরগুলি থেকে স্ট্যাকওভারফ্লোকে বিশৃঙ্খলা মুক্ত রাখতে সহায়তা করুন। আমরা RTFM বলতে পারবে না, কিন্তু এমনকি একটি দ্রুত এ নজরে Stringডক্স এড়ানোর ভালো একটি উত্তর সাহায্য করেছেন হবে ...
maček
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.