मैं रूबी में अग्रणी शून्य उत्पादन कैसे कर सकता हूं?


238

मैं एक रूबी स्क्रिप्ट से क्रमांकित फ़ाइलों का एक सेट आउटपुट कर रहा हूं। संख्या एक काउंटर को बढ़ाने से आती है, लेकिन उन्हें निर्देशिका में अच्छी तरह से बनाने के लिए, मैं फ़ाइल नाम में अग्रणी शून्य का उपयोग करना चाहूंगा। दूसरे शब्दों में

file_001 ...

के बजाय

file_1

क्या किसी संख्या को स्ट्रिंग में परिवर्तित करते समय अग्रणी शून्य जोड़ने का एक सरल तरीका है? (मुझे पता है कि मैं "अगर 10 से कम कर सकता हूँ .... अगर 100 से कम है")।

जवाबों:


281

यदि काउंटर में अंकों की अधिकतम संख्या ज्ञात है (उदाहरण के लिए, एन = 3 काउंटरों के लिए 1..876), तो आप कर सकते हैं

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

8
हेह हे, सबसे अच्छा जवाब नहीं है, लेकिन मैं अन्याय के बारे में नहीं जानता था और मैं सालों से माणिक का उपयोग कर रहा हूं। चीयर्स!
पॉलिफ़ोनिक

यह वोट देना चाहिए क्योंकि ऐसा लगता है कि कुछ विषम कारणों के लिए रिक्त स्थान के साथ% 03s पैड (% 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, लेकिन समान स्वरूपण कार्य पर्ल, रूबी, अजगर, जावा, php, आदि में उपलब्ध हैं।


1
महान! तो "% s" का अर्थ है "Nth मान को यहां प्रतिस्थापित करें" और "% 03d" का अर्थ है "एक संख्या को यहां प्रतिस्थापित करें, इसे 3-अंकीय संख्या बनाने के लिए आवश्यकतानुसार कई शून्य जोड़ दें?" (मैं अनुमान लगा रहा हूं कि डी का अर्थ है "अंक।") अब मैं इस पर प्रलेखन देखता हूं ( ruby-doc.org/core/classes/String.html#M000770 ), लेकिन यह बहुत संक्षिप्त है और मैं थोड़ा विस्तार करना चाहूंगा ।
नाथन लॉन्ग

1
मैंने एक प्रिंटफ़ फॉर्मेट चीट शीट का लिंक जोड़ा। "s" का अर्थ है "स्ट्रिंग", "d" का अर्थ है "दशमलव संख्या"। "03", का अर्थ है "शून्य के साथ 3 वर्णों के लिए पैड"; "% 3D" रिक्त स्थान के साथ बाईं ओर स्थित होगा।
डैनियल मार्टिन

2
BTW - यह कॉलिंग के समान ही है Kernel#sprintf, जिसे यहाँ प्रलेखित किया गया है: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintf
नाथन लॉन्ग

@ नाथनॉन्ग की टिप्पणी में जोड़ते हुए, इस उत्तर में पहला उदाहरण के रूप में लिखा जाएगा sprintf("%03d", 5)
डेनिस

यह चयनित उत्तर होना चाहिए।
डैन बैरन

50

फ़ाइल नाम बदलने से पहले क्या आप केवल मान के स्ट्रिंग स्वरूपण का उपयोग नहीं कर सकते हैं ?

"%03d" % number

मुझे लगता है कि यह उत्तर @ डैनियल मार्टिन के उत्तर में कुछ भी जोड़ता नहीं है, हालाँकि मुझे इसकी सादगी पसंद है ...
22

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बहुत अच्छी तरह से काम करता है, लेकिन यह रूबोक रूबी स्टाइल गाइड के खिलाफ जाता है :

स्प्रिंटफ और इसके अलियास प्रारूप के उपयोग को काफी क्रिप्टिक स्ट्रिंग #% विधि के अनुकूल करें

हम निम्नलिखित का उपयोग करके अधिक पठनीय तरीके से एक ही परिणाम प्राप्त कर सकते हैं:

format('%03d', number)

1
यदि आपका लक्ष्य एक अस्पष्ट रूबी भाषा सुविधा सीखना है, तो उपनाम का उपयोग करें format। यदि आपका लक्ष्य आपके कोड को समझना आसान बनाना है, तो आपको इसका उपयोग करना चाहिए sprintf, क्योंकि यह मानक सी-लाइब्रेरी का हिस्सा है। इस नाम का उपयोग प्रोग्रामिंग भाषाओं में किया जाता है। जिस तरह से लोग sprintfजानते हैं कि इसके formatलिए एक उपनाम है की तुलना में अधिक लोग समझते हैं कि क्या करता है। सिर्फ इसलिए कि कुछ रुबॉप का हिस्सा है, यह स्वाभाविक रूप से सही या गलत नहीं है। उन नियमों को चुनें जो आपकी परियोजना के लिए सबसे अधिक समझदार हों। '%03d' % numberपढ़ने के लिए और भी आसान है।
तिलो

1
मैं इस एक ही लूप के माध्यम से चला गया, बदल रहा है "%02d" % numकरने के लिए sprintf(...)है, तो करने के लिए format(...)RuboCop के सुझाव के अनुसार। मैंने तब फैसला किया कि मैं sprintfइससे अधिक पारंपरिक था format, इसलिए Style/FormatString: EnforcedStyle: sprintfमैंने इसे रात में अच्छी तरह से सोते हुए rubocop.yml को अपडेट किया ।
डेविड हेम्पी

1

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

आउटपुट

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

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