जाँचता है कि एक चर एक पूर्णांक है


137

क्या रेल 3 या रूबी के पास यह जांचने का एक अंतर्निहित तरीका है कि क्या एक चर एक पूर्णांक है?

उदाहरण के लिए,

1.is_an_int #=> true
"dadadad@asdasd.net".is_an_int #=> false?


1
यह देखने के बजाय कि एक चर एक पूर्णांक है या नहीं, आपको यह देखने के लिए जांचना चाहिए कि क्या चर प्रतिक्रिया करता है to_i। यह रूबी के "डक टाइपिंग" का हिस्सा है: यदि यह पूर्णांक की तरह काम कर सकता है, तो इसे एक की तरह व्यवहार करें।
टिन मैन

4
@ टिन मैन: पूरी तरह से नहीं। "hello" .to_i रिटर्न 0 जो आप की उम्मीद नहीं हो सकती है।
EinLama

1
@AnApprentice आपकी जानकारी के लिए, kind_of?एक अन्य नाम है is_a?
जैकब रीलकिन

3
@ जेकोबेलकिन is_a?थोड़ा अलग है; यह पूछता है कि क्या किसी विशिष्ट वर्ग के उदाहरण की वस्तु; kind_of?पूछता है कि क्या यह एक विशिष्ट वर्ग का उदाहरण या बच्चा है। fido.is_a? Dogसच हैं; fido.kind_of? Animalउदाहरण के लिए सच है।
टॉम हैरिसन

जवाबों:


274

आप is_a?विधि का उपयोग कर सकते हैं

>> 1.is_a? Integer
=> true
>> "dadadad@asdasd.net".is_a? Integer
=> false
>> nil.is_a? Integer
=> false

2
यह बहुत अच्छा है। उस ईमेल पते को मान्य करने का काम करता है?
अपरेंटिस

65
@AnApprentice ईमेल पते को कब से मान्य किया गया था?
याकूब Relkin

4
यदि यह संख्या "11111111" जैसी संख्या में आती है, तो यह काम नहीं करेगा
रिकबरो

नीचे देखें Integer(obj) rescue false यह "1" के लिए काम नहीं करेगा यदि आप जांचना चाहते हैं कि क्या यह कन्वर्ट होगा
एमसी।

4
@Ricbermo "1111111" एक स्ट्रिंग है। एक स्ट्रिंग जो कि और पूर्णांक के लिए परिवर्तनीय होती है।
सकीउल

50

यदि आप यह जानना चाहते हैं कि कोई वस्तु है Integer या ऐसी कोई चीज है जिसे सार्थक रूप से एक इंटीजर में परिवर्तित किया जा सकता है (ऐसी चीजों को शामिल नहीं "hello"किया to_iजाएगा , जो परिवर्तित हो जाएंगी 0):

result = Integer(obj) rescue false

2
शायद मैं सिर्फ एक noob हूँ, लेकिन इस tweak ने मेरी मदद की होगी। परिणाम = अंतरा (ओब्ज) बचाव असत्य।
जॉन करी

यदि आप इसे सुधार सकते हैं, तो @JohnCurry, उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें। इस तरह एसओ काम करता है।
एलेक्स डी

2
मैंने किया, यह अस्वीकार हो गया। "यह पोस्ट के मूल इरादे से विचलित करता है" लेकिन ध्यान से, आपके उत्तर के लिए धन्यवाद, इससे मुझे अपने मुद्दे को हल करने में मदद मिली!
जॉन करी

7
इंटेगर ('08 ') स्ट्रिंग की वजह से विफल हो जाएगा क्योंकि अष्टक के रूप में व्याख्या की जा रही है, इंटेगर ('08', 10) ठीक काम करता है। शायद ज़रुरत पड़े।
जोंग बोर ली

1
यकीन नहीं तो Integer(2.5) => 2हमेशा सार्थक रूपांतरण।
मटकाजा

29

एक स्ट्रिंग पर एक नियमित अभिव्यक्ति का उपयोग करें:

def is_numeric?(obj) 
   obj.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
end

यदि आप जांचना चाहते हैं कि क्या चर एक निश्चित प्रकार का है, तो आप बस उपयोग कर सकते हैं kind_of?:

1.kind_of? Integer #true
(1.5).kind_of? Float #true
is_numeric? "545"  #true
is_numeric? "2aa"  #false

यह वही है जो मैं is_numeric की तलाश में था?
वर्कड्रीमर

मुझे लगता है कि यह करीब है, लेकिन बिल्कुल सही नहीं है। उदाहरण के लिए, यह ".34" के लिए विफल हो जाएगा। समस्या यह है, मुझे लगता है, कि है निर्दिष्ट करता है एक गैर लालची मैच, आप जबकि शायद एक वैकल्पिक मैच चाहते हैं। बदलने के लिए इसे ठीक कर सकता है, लेकिन मुझे यकीन है कि होने के लिए परीक्षण का एक सूट के माध्यम से इसे चलाने के लिए चाहते हैं। यह भी हेक्स या घातीय संकेतन से मेल नहीं खाएगा, लेकिन मुझे यकीन है कि यह कुछ उपयोग मामलों के लिए ठीक है। \d+??\d+?\d*
जेफ

1
सिर्फ इस regexp का उपयोग करने के लिए क्यों नहीं \A\d+\z:?
NARKOZ

1
Integer(obj) rescue falseनीचे @ एलेक्स-डी से कोड की तुलना करें ; regexp को पढ़ना मुश्किल है और इसके इरादे में स्पष्ट नहीं है। दोनों काम, मैं हमेशा खराब काम कर रहे regexp को ठीक करने के प्रयास में इस सवाल पर आया था कि हमेशा काम नहीं कर रहा था :-)
टॉम हैरिसन

17

यदि आप वैरिएबल के प्रकार से अनिश्चित हैं (यह संख्या वर्णों की एक स्ट्रिंग हो सकती है), तो कहें कि यह एक क्रेडिट कार्ड नंबर था जिसे पैरामस में पास किया गया था, इसलिए यह मूल रूप से एक स्ट्रिंग होगा लेकिन आप यह सुनिश्चित करना चाहते हैं कि यह न हो ' t इसमें कोई अक्षर है, मैं इस विधि का उपयोग करूंगा:

    def is_number?(obj)
        obj.to_s == obj.to_i.to_s
    end

    is_number? "123fh" # false
    is_number? "12345" # true

@ बेनी इस पद्धति का निरीक्षण करते हैं, इसे ध्यान में रखें:

is_number? "01" # false. oops!

धन्यवाद, आप मेरा दिन बचाते हैं। किसी के लिए भी यह जाँचने की आवश्यकता है कि यह तैरता है या नहीं obj.to_s == obj.to_f.to_sबस सीधे मेरे मामले में बदल सकता है।
ksugiarto

एडमंड कि चालाक है! 🙌
सिवालिकम

बहुत बढ़िया, मैं इसे इंटेगर ('123fh') और बचाव अपवाद की तुलना में पसंद करता हूं।
zw963

6

आप ट्रिपल बराबर का उपयोग कर सकते हैं।

if Integer === 21 
    puts "21 is Integer"
end

5

var.is_a? Classआपके मामले में वहाँ है:) var.is_a? Integer; यह बिल फिट हो सकता है। या वहाँ है Integer(var), जहां यह एक अपवाद फेंक देंगे अगर यह इसे पार्स नहीं कर सकता।


3

एक अधिक "बतख टाइपिंग" तरीका respond_to?इस तरह से उपयोग करना है "पूर्णांक-जैसा" या "स्ट्रिंग-जैसे" वर्गों का भी उपयोग किया जा सकता है

if(s.respond_to?(:match) && s.match(".com")){
  puts "It's a .com"
else
  puts "It's not"
end

2

यदि आपको शून्य मानों को परिवर्तित करने की आवश्यकता नहीं है, तो मुझे विधियाँ to_iऔर to_fअत्यंत उपयोगी होने की आवश्यकता है क्योंकि वे स्ट्रिंग को या तो एक शून्य मान (यदि परिवर्तनीय या शून्य नहीं हैं) या वास्तविक Integerया Floatमान में बदल देंगे ।

"0014.56".to_i # => 14
"0014.56".to_f # => 14.56
"0.0".to_f # => 0.0
"not_an_int".to_f # 0
"not_a_float".to_f # 0.0

"0014.56".to_f ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => I'm a float
"not a float" ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => "I'm not a float or the 0.0 float"

EDIT2: सावधान रहें, 0पूर्णांक मान गलत नहीं है यह सत्य है ( !!0 #=> true) (धन्यवाद @prettycoder)

संपादित करें

आह सिर्फ काले मामलों के बारे में पता चला ... लगता है कि संख्या पहले स्थान पर है, हालांकि केवल ऐसा ही होगा

"12blah".to_i => 12

रूबी में 0 सच है!
सुंदरकांड

1
@prettycoder सिर के लिए धन्यवाद, मैं इस जवाब में तुरंत ठीक कर दूंगा
सिरिल डचोन-डोरिस

1

शोधन का उपयोग करके, एलेक्स डी के उत्तर को भुनाने के लिए :

module CoreExtensions
  module Integerable
    refine String do
      def integer?
        Integer(self)
      rescue ArgumentError
        false
      else
        true
      end
    end
  end
end

बाद में, आप कक्षा में:

require 'core_ext/string/integerable'

class MyClass
  using CoreExtensions::Integerable

  def method
    'my_string'.integer?
  end
end

0

मुझे यह निर्धारित करने का प्रयास करने से पहले एक समान मुद्दा है कि क्या कुछ स्ट्रिंग या किसी प्रकार की संख्या है। मैंने एक नियमित अभिव्यक्ति का उपयोग करने की कोशिश की है, लेकिन यह मेरे उपयोग के मामले के लिए विश्वसनीय नहीं है। इसके बजाय, आप यह देखने के लिए कि यह न्यूमेरिक क्लास का वंशज है, वेरिएबल की क्लास को देख सकते हैं।

if column.class < Numeric
  number_to_currency(column)
else
  column.html_safe
end

इस स्थिति में, आप किसी भी न्यूमेरिक वंश के लिए स्थानापन्न कर सकते हैं: बिगडिमल, दिनांक :: इन्फिनिटी, इंटीजर, फिक्सनम, फ्लोट, बिग्नम, तर्कसंगत, कॉम्प्लेक्स


-1

शायद आप कुछ इस तरह की तलाश कर रहे हैं:

"2.0 या 2.0 को INT के रूप में स्वीकार करें लेकिन 2.1 और" 2.1 "को अस्वीकार करें

संख्या = २.०

अगर num.is_a? स्ट्रिंग संख्या = फ्लोट (संख्या) बचाव गलत अंत

new_num = पूर्णांक (संख्या) बचाव असत्य

संख्या डालता है

नई_नम डालता है

संख्या == new_num डालता है

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