2014-07-27 6 views
30

वेब प्रोग्रामिंग के लिए, संख्या स्ट्रिंग के रूप में आती है। लेकिन to_i"5abc" से 5 और "abc" से 0, दोनों गलत उत्तरों को परिवर्तित करेगा। इन पकड़ने के लिए, मैं ने लिखा है:कड़ाई से स्ट्रिंग को पूर्णांक में परिवर्तित करें (या शून्य)

def number_or_nil(s) 
    number = s.to_i 
    number = nil if (number.to_s != s) 
    return number 
end 

वहाँ एक neater है, इस रूपांतरण को पूरा करने और पता लगाने कि स्ट्रिंग एक नंबर के रूप में इरादा नहीं था की अधिक रूबी प्राकृतिक तरीका है?

+0

'5 '' '5' या' शून्य' होना चाहिए? –

+0

प्रश्न स्पष्ट नहीं है। 'To_i' के साथ क्या गलत है? "यह रूपांतरण" क्या है? – sawa

+0

शून्य मैं अपेक्षा करता हूं, हालांकि मैं संभवतः 5 के साथ रह सकता हूं। –

उत्तर

56

उपयोग पूर्णांक (स्ट्रिंग)

यह एक ArgumentError त्रुटि बढ़ा देंगे यदि स्ट्रिंग एक पूर्णांक में परिवर्तित नहीं कर सकते हैं।

Integer('5abc') #=> ArgumentError: invalid value for Integer(): "5abc" 
Integer('5') #=> 5 

आप अभी भी अपने number_or_nil विधि की जरूरत है अगर आप व्यवहार जब एक स्ट्रिंग नहीं बदला जा सकता है कि नहीं के बराबर दिया जाता है होना चाहता हूँ चाहते हैं।

def number_or_nil(string) 
    Integer(string || '') 
rescue ArgumentError 
    nil 
end 

आपको किसी विशेष अपवाद से बचाव के लिए सावधान रहना चाहिए। एक नंगे बचाव (जैसे कि "बचाव नील") मानक त्रुटि से प्राप्त किसी भी त्रुटि से बचाव करेगा और आपके प्रोग्राम के निष्पादन में हस्तक्षेप कर सकता है जिस तरह से आप उम्मीद नहीं करते हैं। इंटीजर() एक ArgumentError उठाएगा, तो इसे निर्दिष्ट करें।

आप बल्कि अपवादों के साथ सौदा नहीं करना चाहते तो और केवल आपके अंतर्निहित वापसी मान का लाभ उठाने और के रूप में यह लिख सकते हैं अपने number_or_nil के संक्षिप्त संस्करण पसंद करते हैं:

def number_or_nil(string) 
    num = string.to_i 
    num if num.to_s == string 
end 

number_or_nil '5' #=> 5 
number_or_nil '5abc' #=> nil 

इस तरह से आप उम्मीद करते हैं काम करेंगे।

+3

केवल चेतावनी 'इंटीजर (शून्य)' टाइप 'टाइपरर' है, इसलिए 'इंटीजर (स्ट्रिंग ||' ')' अधिक सुसंगत है। – RocketR

+0

अच्छा बिंदु @RocketR! –

+1

'इंटीजर (स्ट्रिंग)' के लिए मुझे (आधिकारिक) दस्तावेज कहां मिल सकता है? जहां तक ​​मैं देख सकता हूं कि आधिकारिक [रूबी 'इंटीजर' दस्तावेज] में इसका कोई उल्लेख नहीं है (http://ruby-doc.org/core-2.2.3/Integer.html)। – apepper

0

str जांचने के लिए एक सरल रेगेक्स का उपयोग करें एक पूर्णांक है।

def number_or_nil(str) 
    str.to_i if str[/^-?\d+$/] and str.line.size == 1 
end 
+0

से निपट रहे हैं क्योंकि इनपुट वेब से आ रहा है, इसलिए आपको अपने उत्तर को बहु- लाइन सामग्री। str.to_i अगर str [/ \ A \ d + \ z /] –

+0

नकारात्मक पूर्णांक, सफेद जगह? –

+0

इसे फिक्स्ड। मुझे पूर्णांक, कोई सफेद जगह, कोई नई लाइन के लिए सख्त नियमों की अपेक्षा नहीं है। – hakcho

संबंधित मुद्दे

 संबंधित मुद्दे