রুবিতে একটি স্ট্রিংয়ে প্রথম অক্ষরটিকে কীভাবে মূলধন করা যায়


134

upcaseপদ্ধতি সম্পূর্ণ পংক্তি capitalizes, কিন্তু আমি শুধুমাত্র প্রথম চিঠি পুঁজিতে করতে হবে।

এছাড়াও, আমার বেশ কয়েকটি জনপ্রিয় ভাষা যেমন জার্মান এবং রাশিয়ানকে সমর্থন করা দরকার।

আমি এটা কিভাবে করব?


4
জেনে থাকুন যে প্রথম ভাষার মূলধনটি কী হতে হবে সে সম্পর্কে কিছু ভাষার বিভিন্ন ধারণা রয়েছে। আইরিশ ভাষায়, আপনি "i mBaile Clitha Cliath" ("ডাবলিনে") - লোয়ার-কেস 'এম', আপার কেস 'বি' এর মতো কাজ করেন। ( এন.ইউইকিপিডিয়া.আর.উইকি / কনসন্যান্ট_মুটেশন # সেল্টিক_ ভাষা অনুবাদগুলি দেখুন যদি আপনি আগ্রহী হন যে আইরিশ কেন এটি করবে এবং কেন এটি বোধগম্য।)
জেমস মুর

3
এবং এও সচেতন থাকুন যে # ক্যাপিটালাইজ হ'ল সমস্ত অক্ষর হ'ল যা প্রথম অক্ষর নয় ... যা আপনি সর্বদা চান তা নয়। ['space', 'UFO', 'NASA'].collect{|w| w.capitalize} #=> ['Space', 'Ufo', 'Nasa']
হুলিয়াক্স

উত্তর:


260

আপনি কোন রুবি সংস্করণ ব্যবহার করেন তার উপর নির্ভর করে:

রুবি ২.৪ এবং উচ্চতর:

এটি কেবল কাজ করে, যেহেতু রুবি v2.4.0 ইউনিকোড কেস ম্যাপিং সমর্থন করে:

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

রুবি ২.৩ এবং নিম্ন:

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

সমস্যাটি হচ্ছে, এটি আপনি যা চান তা কেবল তা করে না, এটি марияপরিবর্তে আউটপুট করে Мария

আপনি যদি রেলগুলি ব্যবহার করেন তবে একটি সহজ কাজ রয়েছে:

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

অন্যথায়, আপনাকে ইউনিকোড রত্ন ইনস্টল করতে হবে এবং এটি এটি ব্যবহার করতে হবে:

require 'unicode'

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

রুবি ১.৮:

কোডিং যাদু মন্তব্য ব্যবহার করতে ভুলবেন না :

#!/usr/bin/env ruby

puts "мария".capitalize

দেয় invalid multibyte char (US-ASCII), যখন:

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

puts "мария".capitalize

ত্রুটি ছাড়াই কাজ করে, তবে বাস্তব মূলধনের জন্য "রুবি ২.৩ এবং নিম্ন" বিভাগটিও দেখুন।


19
নোট করুন যে আপাতভাবে "my API is great".capitalizeউত্পাদন করবে My api is greatযা সম্ভবত অনাকাঙ্ক্ষিত আচরণ। সুতরাং এই উত্তরটি সত্যিই প্রশ্নের উত্তর দেয় না কারণ তিনি কেবল প্রথম চিঠিটি আপার কেস এবং অন্যদের অনিচ্ছুক দিকে চেয়েছিলেন।
ড্যানিয়েল এ আর ওয়ার্নার

55

স্ট্রিংয়ের প্রথম শব্দটির প্রথম অক্ষরকে মূলধন করুন

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

প্রতিটি শব্দের প্রথম অক্ষরকে মূলধন করুন

রেলপথে:

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

অথবা

"kirk_douglas".titleize
=> "Kirk Douglas"    

রুবিতে:

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

রেলের বাইরে, তবে এখনও শিরোনাম পদ্ধতিটি ব্যবহার করতে চাই

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

1
খাঁটি রুবি সমাধানের জন্য উত্সাহ দিন। খুব অলস ফায়ার আপ সঠিক পাগল, এবং এই কৌতুক :) করেনি
illbzo1

19

দুর্ভাগ্যক্রমে, কোনও মেশিনের পক্ষে সঠিকভাবে আপস / ডাউনচেস / মূলধন তৈরি করা অসম্ভব। কম্পিউটারটি বুঝতে এটির জন্য অনেক বেশি প্রাসঙ্গিক তথ্য প্রয়োজন।

সে কারণেই রুবির Stringশ্রেণি কেবলমাত্র ASCII অক্ষরের জন্য মূলধনকে সমর্থন করে, কারণ সেখানে এটি অন্তত কিছুটা সংজ্ঞায়িত।

"প্রাসঙ্গিক তথ্য" বলতে আমি কী বুঝি?

উদাহরণস্বরূপ, iসঠিকভাবে মূলধন তৈরি করতে, আপনার পাঠ্যটি কোন ভাষায় রয়েছে তা জানতে হবে English উদাহরণস্বরূপ, ইংরেজী, মাত্র দুটি iগুলি: Iবিন্দু ছাড়াই এবং ছোট iবিন্দুর সাথে ছোট capital তবে তুরস্কের চারটি রয়েছে i: Iবিন্দু ছাড়াই মূলধন , বিন্দুর İসাথে মূলধন , ıবিন্দুর iসাথে ছোট, বিন্দুর সাথে ছোট । সুতরাং, ইংরেজি 'i'.upcase # => 'I'এবং তুর্কি ভাষায় 'i'.upcase # => 'İ'। অন্য কথায়: যেহেতু 'i'.upcaseভাষার উপর নির্ভর করে দুটি ভিন্ন ফলাফল প্রত্যাবর্তন করতে পারে, তাই কোনও শব্দটির ভাষা না জেনে সঠিকভাবে মূলধন করা অসম্ভব।

তবে রুবি ভাষা জানেন না, এটি কেবল এনকোডিং জানেন knows সুতরাং রুবির অন্তর্নির্মিত কার্যকারিতা সহ একটি স্ট্রিং সঠিকভাবে মূলধন করা অসম্ভব।

এটা তোলে খারাপ: এমনকি সঙ্গে ভাষা বুদ্ধিমান, এটা মূলধন সঠিকভাবে কখনও কখনও অসম্ভব। উদাহরণস্বরূপ, জার্মান ভাষায়, 'Maße'.upcase # => 'MASSE'( সার্বজনীনভাবে এর বহুবচন ভর অর্থ পরিমাপ )। তবে, 'Masse'.upcase # => 'MASSE'(মানে ভর )। তো, কী 'MASSE'.capitalize? অন্য কথায়: সঠিকভাবে মূলধন করার জন্য একটি পূর্ণ বর্ধিত কৃত্রিম বুদ্ধি প্রয়োজন requires

সুতরাং, পরিবর্তে কখনও কখনও ভুল উত্তর দেবার, মাঝে মাঝে রুবি তা চয়ন কোন উত্তর দিতে এ সব , যার কারণে নন- ASCII অক্ষর কেবল downcase / upcase / অপারেশন পুঁজিতে উপেক্ষা দেখায়। (অবশ্যই কোনটি ভুল ফলাফলও পড়ে, তবে অন্তত এটি পরীক্ষা করা সহজ))


4
দুঃখিত, কিন্তু আপনার যুক্তি জল ধরে না। এটি সত্য নয় যে রুবি কোনও উত্তরই দিতে পছন্দ করেন না, রুবি সবসময় একটি উত্তর দেয় যা প্রায়শই ভুল - যেমন "мария" upউপাসকে কখনই "мария" ফেরানো উচিত নয়, এটি কোনও প্রসঙ্গে সঠিক নয়। এবং এআইয়ের প্রয়োজনীয়তা সম্পর্কে আপনার মতামত মোটেই প্রাসঙ্গিক নয় - এমন কোনও কিছুই নেই যা অ্যারে পুনরুদ্ধার করতে বাধা দেয় না, 'আই.উপ্যাসেস' এর জন্য ['আমি', 'İ'] বলুন এবং কলকারীকে সিদ্ধান্ত নিতে দেয় যে কোন মূলধন প্রাসঙ্গিক প্রদত্ত পরিস্থিতিতে বর্তমানে রুবির হাতের উপরের- এবং ছোট হাতের মধ্যে রূপান্তর হ্যান্ডেল হয়ে গেছে এবং এটিই।
মিচাউ

2
-1 কারণ এখানে একটি মূলধন এসজেট রয়েছে । কিছু অ সম্পূর্ণরূপে আনুষ্ঠানিক অঞ্চল ব্যবহার করা কেবলমাত্র এআইয়ের মাধ্যমেই সমাধানের প্রমাণ হিসাবে কাজ করতে পারে না।
মাইক

15

ঠিক আছে, কেবলমাত্র আমরা জানি যে কীভাবে কেবলমাত্র প্রথম অক্ষরকে মূলধন করা যায় এবং বাকীগুলি একা রেখে দেওয়া যায়, কারণ কখনও কখনও এটিই পছন্দ হয়:

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

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

কলিং এর capitalizeফলাফল হবে ["Nasa", "Mhz", "Sputnik"]


ধন্যবাদ আমি যা খুঁজছিলাম ঠিক
গুড লাক্স

2
word[0] = word[0].upcase
ডেভিড

@David। না! এটি অ্যারে শব্দের মান পরিবর্তন করে যে # কলিকে ডাকা হয়। এটি একটি খারাপ পার্শ্ব প্রতিক্রিয়া।
হুলিয়াক্স

আমি একটি শব্দের প্রথম অক্ষরকে মূলধনের জন্য একটি সহজ উপায় দেখছিলাম, এই সমাধানটির অভ্যন্তরীণ 3 টি লাইন প্রতিস্থাপন করে, যা আমি wordভেরিয়েবলটি ব্যবহার করে পরিষ্কার করে দিয়েছি । অবশ্যই, যদি আপনার আরও শব্দ থাকে তবে কেবল তাদের সকলকে কল করুন! ;)words.map{|word| word[0] = word[0].upcase}
ডেভিড

@David। আপনার কোড পরিমাণে #capitalize!এবং না #capitalize। পূর্ববর্তীটি একটি নতুন স্ট্রিং প্রদান করে যখন প্রাক্তন পদ্ধতির রিসিভারটি সংশোধন করে (এই ক্ষেত্রে রিসিভারটি হয় wordএবং পদ্ধতিটি হয় #[])। আপনি যদি # কোডোলক্ট ব্লকের ভিতরে আপনার কোড ব্যবহার করেন তবে আপনি তাদের প্রত্যেকটিতে একই স্ট্রিং অবজেক্টের সাথে দুটি পৃথক অ্যারে দিয়ে শেষ করতে চান (এবং স্ট্রিংগুলি সংশোধন করা হত)। এটি এমন কিছু নয় যা আপনি সাধারণত করতে চান। এমনকি আপনি যদি এ সম্পর্কে অবগত হন তবে অন্য পাঠকদেরও এটি বোঝা উচিত।
হুলিয়াক্স

8

রেল 5+

অ্যাক্টিভ সাপোর্ট এবং রিয়েল 5.0.0.beta4 হিসাবে আপনি উভয় পদ্ধতির একটি ব্যবহার করতে পারেন: String#upcase_firstবা ActiveSupport::Inflector#upcase_first

"my API is great".upcase_first #=> "My API is great"
"мария".upcase_first           #=> "Мария"
"мария".upcase_first           #=> "Мария"
"NASA".upcase_first            #=> "NASA"
"MHz".upcase_first             #=> "MHz"
"sputnik".upcase_first         #=> "Sputnik"

চেক " : পদ্ধতি upcase_first নিউ পাগল 5 আরও তথ্যের জন্য"।


3

ব্যবহার capitalize। থেকে স্ট্রিং ডকুমেন্টেশন:

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

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

আপনি যদি মূল স্ট্রিংটি পরিবর্তন করতে চান তবে কেবল উদমতার পয়েন্টটি ব্যবহার করুন।
ম্যাগনার

doh ধন্যবাদ, আমার ভুল সংশোধন
jhwist

5
-1। ওপি স্পষ্টভাবে জার্মান এবং রাশিয়ান পাঠ্যের উল্লেখ করেছে, যা অ-এসসিআইআই অক্ষরকে বোঝায়। String#upcase(এবং এছাড়াও String#downcase) কেবলমাত্র ASCII অক্ষরের জন্য সংজ্ঞাযুক্ত।
Jörg W Mittag

1
আজ রুবি 2.5.0 ব্যবহার করে এবং String#upcaseঅ ASCII অক্ষরগুলিতে সূক্ষ্ম কাজ করে বলে মনে হচ্ছে। 2.5.0 :001 > "мария".upcase => "МАРИЯ"
হুলিয়াক্স

1
@ হুলিয়াক্স যেমন গৃহীত উত্তরে উল্লিখিত হয়েছে, এটি রুবি ২.৪.০ (যা ২০১ released সালে প্রকাশিত হয়েছিল) থেকেই হয়েছে।
নিসেতামা

2

আপনি ব্যবহার করতে পারেন mb_chars। এটি umlaute সম্মান:

class String

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

end

উদাহরণ:

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

0

নীচে প্রতিটি স্ট্রিংকে স্ট্রিংয়ে মূলধন করার আরও একটি উপায় রয়েছে। \wসিরিলিক অক্ষর বা ল্যাটিন বর্ণগুলি ডায়াক্রিটিক্সের সাথে মেলে না তবে [[:word:]]তা করে। upcase, downcase, capitalize, এবং swapcaseরুবি 2.4.0 যা 2016 সালে মুক্তি পায় পর্যন্ত নন- ASCII অক্ষর প্রযোজ্য ছিল না।

"aAa-BBB ä мария _a a_a".gsub(/\w+/,&:capitalize)
=> "Aaa-Bbb ä мария _a A_a"
"aAa-BBB ä мария _a a_a".gsub(/[[:word:]]+/,&:capitalize)
=> "Aaa-Bbb Ä Мария _a A_a"

[[:word:]] এই বিভাগগুলিতে অক্ষরের সাথে মেলে:

Ll (Letter, Lowercase)
Lu (Letter, Uppercase)
Lt (Letter, Titlecase)
Lo (Letter, Other)
Lm (Letter, Modifier)
Nd (Number, Decimal Digit)
Pc (Punctuation, Connector)

[[:word:]]"বিরামচিহ্ন, সংযোগকারী" ( Pc) বিভাগের সমস্ত 10 টি অক্ষরের সাথে মেলে :

005F _ LOW LINE
203F ‿ UNDERTIE
2040 ⁀ CHARACTER TIE
2054 ⁔ INVERTED UNDERTIE
FE33 ︳ PRESENTATION FORM FOR VERTICAL LOW LINE
FE34 ︴ PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
FE4D ﹍ DASHED LOW LINE
FE4E ﹎ CENTRELINE LOW LINE
FE4F ﹏ WAVY LOW LINE
FF3F _ FULLWIDTH LOW LINE

স্ট্রিংয়ের প্রথম অক্ষরটিকে কেবল বড় হাতের মধ্যে রূপান্তর করার এটি অন্য উপায়:

"striNG".sub(/./,&:upcase)
=> "StriNG"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.