2010-06-16 6 views
6

मैं निम्नलिखित संख्या लेने के लिए कोशिश कर रहा हूँ:रूबी में हर चार पूर्णांक के बीच मैं रिक्त स्थान कैसे बना सकता हूं?

423523420987 

और यह इस में बदलने का:

4235 2342 0987 

यह जरूरी एक पूर्णांक या तो होना करने के लिए नहीं है। वास्तव में, मैं इसे एक स्ट्रिंग बनना पसंद करूंगा।

+3

क्या आपकी संख्या 4 के समूहों में समान रूप से तोड़ने की गारंटी है? यदि नहीं, तो क्या आप शुरुआत में <4 समूह (12 3456 78 9 0) या अंत (1234 5678 9 0) चाहते हैं? –

उत्तर

13

आप एक नियमित अभिव्यक्ति के साथ String::gsub उपयोग कर सकते हैं:

=> 'abcdefghijkl'.gsub(/.{4}(?=.)/, '\0 ') 
'abcd efgh ijkl' 
+0

यह शायद सबसे तेज़ है, गेटेट को पढ़ने में आसान है, केवल इसलिए कि आवश्यक रेगेक्स सरल है। –

0

प्रत्येक अंक के माध्यम से लूप और यदि लूप इंडेक्स मोड 4 = 0 तो एक स्पेस रखें।

Modulus in Ruby

13
class String 
    def in_groups_of(n, sep=' ') 
    chars.each_slice(n).map(&:join).join(sep) 
    end 
end 

423523420987.to_s.in_groups_of(4)  # => '4235 2342 0987' 
423523420987.to_s.in_groups_of(5, '-') # => '42352-34209-87' 
2

आप मामले में गद्देदार शून्य के लिए देख रहे हैं आप कम से कम 12 या 12 संख्या की तुलना में अधिक इस में मदद मिलेगी है तुम बाहर:

irb(main):002:0> 423523420987.to_s.scan(/\d{4}/).join(' ') 
=> "4235 2342 0987" 
irb(main):008:0> ('%d' % 423523420987).scan(/\d{4}/).join(' ') 
=> "4235 2342 0987" 
+0

मार्क बेयर्स शायद सबसे तेज़ है, यह मेरी राय में सबसे सुंदर है। –

+0

संपादन के बाद "गद्देदार शून्य" नो लोनर के बारे में थोड़ा सा लागू होता है। –

2

@Mark Byer के एक पर विस्तार करने के लिए nswer और @glenn mcdonald की टिप्पणी, आप क्या करना चाहते हैं यदि आपकी स्ट्रिंग/संख्या की लंबाई 4 से अधिक नहीं है?

'1234567890'.gsub(/.{4}(?=.)/, '\0 ') 
# => "1234 5678 90" 

'1234567890'.reverse.gsub(/.{4}(?=.)/, '\0 ').reverse 
# => "12 3456 7890" 
संबंधित मुद्दे