আমি কীভাবে রুবিতে শীর্ষস্থানীয় শূন্যগুলি আউটপুট করতে পারি?


238

আমি রুবি স্ক্রিপ্ট থেকে সংখ্যাযুক্ত ফাইলের একটি সেট আউটপুট করছি। নম্বরগুলি কাউন্টার বাড়ানো থেকে আসে তবে তাদের ডিরেক্টরিতে সুন্দরভাবে সাজানোর জন্য, আমি ফাইলের নামগুলিতে শীর্ষস্থানীয় শূন্যগুলি ব্যবহার করতে চাই। অন্য কথায়

file_001 ...

পরিবর্তে

file_1

সেখানে একটি Is সহজ যখন একটি স্ট্রিং একটি সংখ্যাকে রূপান্তর বসানো শূন্যগুলি যোগ করার জন্য উপায়? (আমি জানি আমি "10 এর কম হলে .... যদি 100 এর চেয়ে কম হয়") করতে পারি।

উত্তর:


281

যদি কাউন্টারে সর্বাধিক সংখ্যার পরিচিত হয় (উদাহরণস্বরূপ, কাউন্টারগুলির জন্য এন = 3 1..৮7676), আপনি এটি করতে পারেন

str = "file_" + i.to_s.rjust(n, "0")

8
হি হেহ, সেরা উত্তর নয়, তবে আমি র‌্যাড সম্পর্কে জানতাম না এবং আমি কয়েক বছর ধরে রুবি ব্যবহার করি। চিয়ার্স!
পলিউফোনিক

এটি ভোট দিতে হবে কারণ মনে হচ্ছে যে কোনও 033 প্যাড প্যাডগুলি কোনও বিজোড় কারণে (% 03d ভাল কাজ করে বলে মনে হচ্ছে) ফাঁকা রয়েছে। আমি উভয় ক্ষেত্রে শূন্যের সাথে সি প্যাডড শপথ করতে পারতাম।
Nerdmaster

অবশেষে এটি গ্রহণযোগ্য উত্তর হিসাবে স্যুইচ করেছে কারণ এটি মনে রাখা সবচেয়ে সহজ এবং সহজ। %কাজ করে তবে আরও সাধারণ উদ্দেশ্য।
নাথান লং

অপ্রত্যাশিত তবে সবচেয়ে সহজ
akostadinov

1
কীভাবে একটি বেস 36 নম্বর প্যাড করতে এখানে এসেছেন। এটি তার জন্য কাজ করে, যেখানে% দেখে মনে হচ্ছে এটি হবে না। ধন্যবাদ!
ইথান কামিনস্কি

344

%একটি স্ট্রিং সহ অপারেটরটি ব্যবহার করুন :

irb(main):001:0> "%03d" % 5
=> "005"

বাম-হাতটি একটি প্রিন্টফ ফর্ম্যাট স্ট্রিং এবং ডানদিকের দিকটি মানগুলির একটি তালিকা হতে পারে, সুতরাং আপনি এর মতো কিছু করতে পারেন:

irb(main):002:0> filename = "%s/%s.%04d.txt" % ["dirname", "filename", 23]
=> "dirname/filename.0023.txt"

এখানে একটি প্রিন্টফ ফর্ম্যাট চিট শীট যা আপনার ফর্ম্যাট স্ট্রিং গঠনে আপনাকে দরকারী মনে হতে পারে। প্রিন্টফ ফর্ম্যাটটি মূলত Cফাংশন থেকে printf, তবে অনুরূপ ফর্ম্যাটিং ফাংশনগুলি পার্ল, রুবি, পাইথন, জাভা, পিএইচপি ইত্যাদিতে পাওয়া যায় etc.


1
গ্রেট! সুতরাং "% s" এর অর্থ "এখানে নবম মানের বিকল্প করুন," এবং "% 03 ডি" এর অর্থ "এখানে একটি সংখ্যার বিকল্প দিন, এটি একটি 3-সংখ্যার সংখ্যা বানাতে প্রয়োজনীয় যতগুলি শূন্য যোগ করবেন?" (আমি ঘ মানে অনুমান করছি "ডিজিট।") আমি এই ডকুমেন্টেশান দেখুন NOW ( ruby-doc.org/core/classes/String.html#M000770 ), কিন্তু এটা খুবই সংক্ষিপ্ত এবং আমি একটু বিবরণাদি চাই ।
নাথান লং

1
আমি একটি প্রিন্টফ ফর্ম্যাট চিট শীটে একটি লিঙ্ক যুক্ত করেছি। "এস" এর অর্থ "স্ট্রিং", "ডি" এর অর্থ "দশমিক সংখ্যা"। "03" এর অর্থ "শূন্যের সাথে 3 টি প্যাড থেকে প্যাড"; "% 3d" ফাঁকা জায়গায় বাম দিকে প্যাড করবে।
ড্যানিয়েল মার্টিন


@ নাথানলং এর মন্তব্যে যোগ করা, এই উত্তরের প্রথম উদাহরণ হিসাবে লেখা হবে sprintf("%03d", 5)
ডেনিস

এটি নির্বাচিত উত্তর হওয়া উচিত।
ড্যান ব্যারন

50

ফাইলের নামটি কনক্ট করার আগে আপনি কি মানটির স্ট্রিং ফর্ম্যাটিং ব্যবহার করতে পারবেন না ?

"%03d" % number

আমি মনে করি এই উত্তরটি @ ড্যানিয়েল মার্টিনের উত্তরে কিছু যুক্ত করে না, তবে আমি এর সরলতা পছন্দ করি ...
svelandiag

3
ড্যানিয়েল মার্টিনের একই মুহুর্তে তিনি উত্তর দিয়েছিলেন তাই সম্ভবত এটি সদৃশ সম্পর্কে অজানা ছিল।
কার্ট পিক

এটি utc_offset- এর জন্য নিখুঁত
হাবিল

30

String#nextকাউন্টার হিসাবে ব্যবহার করুন ।

>> n = "000"
>> 3.times { puts "file_#{n.next!}" }
file_001
file_002
file_003

next তুলনামূলকভাবে 'চালাক', যার অর্থ আপনি এমনকি যেতে পারেন

>> n = "file_000"
>> 3.times { puts n.next! }
file_001
file_002
file_003

এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ. এটি এমন একটি দুর্দান্ত পদ্ধতি।
ওয়েস্টন গাঙ্গার

9

অন্য উত্তরগুলির দ্বারা বর্ণিত হিসাবে, "%03d" % numberবেশ ভাল কাজ করে তবে এটি রুবোকপ রুবি স্টাইল গাইডের বিরুদ্ধে যায় :

মোটামুটি ক্রিপ্টিক স্ট্রিং #% পদ্ধতির উপর স্প্রিন্টফ এবং তার উপন্যাসের বিন্যাসের পক্ষে পছন্দ করুন Favor

আমরা নিম্নলিখিতগুলি ব্যবহার করে আরও পঠনযোগ্য পদ্ধতিতে একই ফল পেতে পারি:

format('%03d', number)

1
যদি আপনার লক্ষ্যটি একটি অস্পষ্ট রুবি ভাষার বৈশিষ্ট্যটি শিখতে হয় তবে উপনামটি ব্যবহার করুন format। যদি আপনার লক্ষ্যটি আপনার কোডটি বোঝা সহজ করে তোলে তবে আপনার ব্যবহার করা উচিত sprintf, কারণ এটি স্ট্যান্ডার্ড সি-লাইব্রেরির অংশ। এই নামটি প্রোগ্রামিং ভাষাতে ব্যবহৃত হয়। আরও লোকেরা কী sprintfকরে তা বুঝতে পারে, এমন সংখ্যার সাথে তুলনা করে যারা জানেন যে formatএটির জন্য একটি নাম alias কিছু রুবকপের অংশ হওয়ায় এটিকে সহজাতভাবে সঠিক বা ভুল করে না। আপনার প্রকল্পের জন্য সর্বাধিক বোধগম্য বিধিগুলি চয়ন করুন। '%03d' % numberপড়া আরও সহজ।
টিলো 20'19

1
আমি এই একই লুপের মাধ্যমে গিয়েছিলাম, পরিবর্তন "%02d" % numকরার জন্য sprintf(...), তারপর format(...)RuboCop এর পরামর্শ প্রতি। আমি তখন সিদ্ধান্ত নিয়েছিলাম যে এর sprintfচেয়ে বেশি প্রচলিত ছিল formatতাই রুবকপ.আইএমএল আপডেট হয়েছে Style/FormatString: EnforcedStyle: sprintfএবং এখন রাতে ভাল ঘুমাচ্ছি।
ডেভিড হেম্পি

1

filenames = '000'.upto('100').map { |index| "file_#{index}" }

আউটপুট

[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.