यदि कोई मान एक संख्या है तो मैं कैसे जांच सकता हूं?


82

मैं केवल यह जांचना चाहता हूं कि फॉर्म टेक्स्ट फ़ील्ड से लौटाया गया मान एक संख्या है: 12, 12.5 या 12.75। क्या यह जांचने का एक सरल तरीका है, खासकर अगर मूल्य को एक के रूप में खींच लिया जाए param?


उम, केवल एक चीज यह है कि कोड is_a_number के लिए काम करता है? एकमात्र अपवाद के साथ काम करता है .02, या .3 नंबर ....
user211662

7
मैं इस समाधान को बहुत पसंद करता हूं : stackoverflow.com/questions/5661466/… मुझे नहीं पता कि इतने सारे लोग क्यों सोचते हैं कि एक regexp उसके लिए बेहतर होगा।
2Called-chaos

जवाबों:


26

बस इसे regexp, यह तुच्छ है, और उस से परे के बारे में सोचने लायक नहीं है:

v =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/

(जस्टिन की टिप्पणी के अनुसार फिक्स्ड)


5
रूबी में, ^ और $ एक लाइन की शुरुआत / अंत को दर्शाते हैं, न कि एक स्ट्रिंग के। यह सैनिटाइज़िंग इनपुट्स के साधन के रूप में उपयोग करने के लिए इस अप्रभावी बनाता है (देखें guide.rubyonrails.org/security.html# अनियमित-expressions )। एक बेहतर दृष्टिकोण होगा: v.to_s =~ /\A[-+]?\d*\.?\d+\z/
जस्टिन

207

आप उपयोग कर सकते हैं

12.is_a? Numeric

( Numericपूर्णांक और फ्लोट के लिए काम करेगा।)

यदि यह एक स्ट्रिंग के रूप में आता है जिसमें वैध संख्या का प्रतिनिधित्व हो सकता है, तो आप उपयोग कर सकते हैं

class String
  def valid_float?
    true if Float self rescue false
  end
end

और '12'.valid_float?यदि आप स्ट्रिंग को एक वैध फ्लोट में बदल सकते हैं (तो जैसे to_f)।


क्षमा करें, यह पटरियों पर रूबी है ... मूल रूप से, मैं सिर्फ उपयोगकर्ता से किसी भी इनपुट का मूल्यांकन करने में सक्षम होना चाहता हूं चाहे वह .03 0.3 हो, 2.2 कुछ बाद में दो काम हो, लेकिन मुझे पहला इनपुट काम करने की आवश्यकता है: एस
user211662

10
Fixnumझांकियों के साथ काम करने के लिए प्रतीत नहीं होता। हालांकि, Numericठीक काम करता है। तो 1.234.is_a? Fixnum == false, लेकिन 1.234.is_a? Numeric == true
कर्टप्रिस्टन

यह फ्लोट्स के साथ काम नहीं करता है। का उपयोग करना चाहिए 1.1.is_a? Numericदेखें stackoverflow.com/a/17668654/76486
ब्रायन आर्मस्ट्रांग

1
मेरे लिए काम नहीं :(pry(main)> '12'.is_a? Numeric => false
सलिल

@ सलिल जाहिर है कि आपके लिए काम नहीं करेगा, '12'एक स्ट्रिंग है। उस स्थिति में रेगेक्स या किसी अन्य संभावित समाधान के साथ स्ट्रिंग की जांच करें।
edmundo096

27

मैं आमतौर पर इन दिनों केवल इंटेगर और फ्लोट का उपयोग करता हूं।

1.9.2p320 :001 > foo = "343"
 => "343"
1.9.2p320 :003 > goo = "fg5"
 => "fg5"

1.9.2p320 :002 > Integer(foo) rescue nil
 => 343
1.9.2p320 :004 > Integer(goo) rescue nil
 => nil

1.9.2p320 :005 > Float(foo) rescue nil
 => 343.0
1.9.2p320 :006 > Float(goo) rescue nil
 => nil


7

बस दो बार स्ट्रिंग बदलें:

num = '12'
num == num.to_i.to_s 
#=> true 

num = '3re'
num == num.to_i.to_s 
#=> false

पूर्णांक के साथ इतना बुरा काम नहीं करता है, लेकिन असफल होने के कई तरीके हैं यदि आप फ़्लोट्स के साथ इस सलाह का पालन करना चाहते हैं (जो कि सवाल के बारे में पूछता है): "7" == "7".to_f.to_s #=> false("7" बनाम "7.0")
डेविड स्टोसिक

आप कर सकते हैंnum == num.to_i.to_s || num == num.to_f.to_s
mannykary

आप दोनों स्ट्रिंग को "%" ऑपरेटर का उपयोग करके प्रारूपित करने की गारंटी दे सकते हैं कि वे दोनों एक ही स्ट्रिंग में समाप्त होते हैं
Jaacko Torus

5

मैं इसका सुझाव दूंगा

def is_number?
  self.to_f == self
end

> 15.is_number?
=> true
> 15.0.is_number?
=> true
> 'Not a number'.is_number?
=> false
> (0/0.0).is_number?
=> false

4
irb(main):005:0> 1.1.is_a? Numeric
=> true
irb(main):006:0> 1.is_a? Numeric
=> true
irb(main):007:0> 'asd'.is_a? Numeric
=> false

7
"1.1" .is_a? न्यूमेरिक => असत्य
वेपलॉक

आप स्ट्रिंग रूपांतरण समस्या से कैसे निपटेंगे? ओपी बताता है कि यह एक पाठ क्षेत्र से है।
schlingel

-5

स्ट्रिंग मान हमेशा 0 .to_i के साथ परिवर्तित होते हैं

[14] pry(main)> 'Apple'.to_i > 0
=> false

[15] pry(main)> '101'.to_i > 0
=> true

किनारे के मामलों के बारे में क्या? यदि संख्या 0 या नकारात्मक है, तो आपका परीक्षण गलत नकारात्मक देगा।
tsikov

इससे भी बदतर '1AB2'.to_i एक चीज के लिए 1 लौटेगा, जो स्पष्ट रूप से एक पूर्णांक नहीं है ...
थॉमस बिंदज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.