2009-08-17 10 views
10

की आवश्यकता है मैं स्ट्रिंग की 'संख्यात्मकता' को सत्यापित करना चाहता हूं (यह सक्रिय-रिकॉर्ड मॉडल में कोई विशेषता नहीं है)। मुझे बस एक वैध आधार 10, सकारात्मक पूर्णांक स्ट्रिंग होने की आवश्यकता है। मैं यह कर रहा हूं:रूबी कार्यान्वयन is_numeric है? स्ट्रिंग्स के लिए, बेहतर विकल्प

class String 
    def numeric? 
    # Check if every character is a digit 
    !!self.match(/\A[0-9]+\Z/) 
    end 
end 

class String 
    def numeric? 
    # Check is there is *any* non-numeric character 
    !self.match(/[^0-9]/) 
    end 
end 

इनमें से कौन सा अधिक व्यावहारिक विकल्प है? या, क्या कोई और बेहतर कार्यान्वयन है?

+0

उत्सुकता से, '{1,1}' गुणक क्यों? डिफ़ॉल्ट रूप से सभी चरित्र वर्गों और अक्षरों को एक बार ठीक से मिलान किया जाता है जब तक अन्यथा निर्दिष्ट नहीं किया जाता है। यह अनावश्यक है। –

+0

मुझे गरीब! मैं इसे एक बार में हटा दूंगा। – Swanand

+0

संबंधित प्रश्न: http://stackoverflow.com/questions/694176/retrieve-number-from-the-string-pattern-using-regular-expression –

उत्तर

10

शो स्रोत पर
क्लिक करें बल्कि ^ और $ से यकीन है कि उपयोग \A और \Z कृपया, स्ट्रिंग में सिर्फ एक ही पंक्ति के बजाय पूरी स्ट्रिंग के मिलान। यदि आप एक अंतिम नई लाइन के साथ एक स्ट्रिंग से मिलान करना टालना चाहते हैं, तो अंत में '\ z' का उपयोग करें। अधिक मुद्दों के लिए, The Regex Tutorial on anchors देखें।

उदाहरण के लिए, /^[0-9]+$/ सफलतापूर्वक निम्नलिखित मेल खाता है:

foo 
1234 
bar 

लेकिन /\A[0-9]+\Z/ नहीं करता है।

5

पहला मुझे मेरे लिए देखता है।

मैं विधि numeric? विधि का नाम दूंगा। मैं is_foo? विधियों का बड़ा प्रशंसक नहीं हूं। वे उन भाषाओं में समझ में आते हैं जिनके पास विधि नामों में प्रश्न चिह्न नहीं हैं (is_foo, isFoo), लेकिन प्रश्न चिह्न के साथ, is अनावश्यक लगता है।

+0

मैं दूसरे का उपयोग कर समाप्त हुआ। – Swanand

1

दूसरा गैर-संख्यात्मक स्ट्रिंग के मामले में तेज़ी से खत्म हो जाएगा, क्योंकि यह पहले खराब चरित्र पर अस्वीकार कर देगा।

इसके अलावा, स्ट्रिंग # to_i विधि की जाँच - यह संभवतः आप क्या चाहते हैं करता है:
http://www.ruby-doc.org/core/classes/String.html#M000787

+0

to_i के साथ समस्या यह है कि आप कभी नहीं जानते कि यह 0 है या नहीं। – moogs

+0

बिल्कुल क्यों मैंने इसका उपयोग नहीं किया। – Swanand

1

मैं अगर यह तेज है नहीं जानता, लेकिन मुझे पसंद है:

class String 
def numeric? 
    true if Integer(object) rescue false 
end 
end 

ऋणात्मक संख्याओं के हैंडल भी। और यदि आप कभी भी भविष्य में फ्लोट्स का समर्थन करना चाहते हैं, तो फ्लोट()

+0

aw बकवास, इसका उपयोग करके "0x122" संख्यात्मक होगा। ओह ठीक है .. – moogs

+0

क्या यह वास्तव में काम करता है? 'वस्तु' कहां से आती है? मेरी रूबी 1.9.2-पी 180 पर यह हमेशा 'झूठी' देता है क्योंकि 'ऑब्जेक्ट' अनिर्धारित है। – mark

3

मैं 100% निश्चित नहीं हूं लेकिन रेल /\A[+-]?\d+\Z/ पूर्णांक के लिए उपयोग कर रहा है। के लिए validates_numericality_ofhere

+0

\ ए -> स्ट्रिंग \ Z -> स्ट्रिंग मूल रूप से वही है जो मैं सकारात्मक/नकारात्मक संशोधक भाग को छोड़कर पहले में अनसुलझा कर रहा हूं। – Swanand

0

एक सरल बेंचमार्क के अनुसार, दूसरा दृष्टिकोण, तेजी से होता है, हालांकि मैं विशेषज्ञ benchmarker नहीं कर रहा हूँ, तो यह एक वैध बेंचमार्क नहीं हो सकता है: http://pastie.org/586777

Zalus 'तर्क सही है। इसे केवल एक गैर-मान्य स्ट्रिंग के लिए जांचना होगा।

2

मैं इसे करने का एक और तरीका सुझाता हूं। इसके अलावा, क्योंकि आपने "सकारात्मक" पूर्णांक से पूछा, मैंने सकारात्मक पूर्णांक और गैर-ऋणात्मक पूर्णांक के लिए दो अलग-अलग तरीकों को बनाया।

require 'benchmark' 
include Benchmark 

bmbm(100) do |x| 
    x.report('numeric?') do 
    "some invalid string".numeric? 
    end 

    x.report('positive_integer?') do 
    "some invalid string".positive_integer? 
    end 

    x.report('nonnegative_integer?') do 
    "some invalid string".nonnegative_integer? 
    end 
end 

परिणाम::

numeric? 
0.000000 0.000000 0.000000 ( 0.000045) 
positive_integer? 
0.000000 0.000000 0.000000 ( 0.000012) 
nonnegative_integer? 
0.000000 0.000000 0.000000 ( 0.000015) 

ऐसा लगता है तेजी से इस माइक्रो बेंचमार्क में हैं positive_integer? की तरह और nonnegative_integer?

class String 
    def numeric? 
    !self.match(/[^0-9]/) 
    end 

    def positive_integer? 
    self.to_i > 0 
    end 

    def nonnegative_integer? 
    self.to_i > 0 or self == '0' 
    end 
end 

यहाँ बेंचमार्क कोड है। ,

class String 
    def integer? 
    self.to_i.to_s == self 
    end 
end 
0

सूचना सकारात्मक & नकारात्मक पूर्णांक के लिए

n = '1234' 
n.to_i.to_s == n 
=> true 

n2 = '1.3' 
n.to_i.to_s == n2 
=> false 

काम करता है, लेकिन नहीं अष्टाधारी/हेक्स अभ्यावेदन:

अंत में, एक तरफ ध्यान दें के रूप में, आप integer? विधि इसी तरह से परिभाषित कर सकते हैं फ्लोट इत्यादि। सर्वश्रेष्ठ (अवांछित) नहीं कर सकते हैं, लेकिन समयपूर्व अनुकूलन के साथ समय बर्बाद नहीं कर सकते हैं।

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