Chcę po prostu sprawdzić, czy zwracana wartość z pola tekstowego formularza to liczba, tj .: 12, 12,5 lub 12,75. Czy istnieje prosty sposób, aby to sprawdzić, zwłaszcza jeśli wartość jest pobierana jako param?
Chcę po prostu sprawdzić, czy zwracana wartość z pola tekstowego formularza to liczba, tj .: 12, 12,5 lub 12,75. Czy istnieje prosty sposób, aby to sprawdzić, zwłaszcza jeśli wartość jest pobierana jako param?
Odpowiedzi:
Po prostu powtórz to, jest to trywialne i nie warto o tym myśleć:
v =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/
(Naprawiono zgodnie z komentarzem Justina)
v.to_s =~ /\A[-+]?\d*\.?\d+\z/.
Możesz użyć
12.is_a? Numeric
( Numericbędzie działać dla liczb całkowitych i zmiennoprzecinkowych).
Jeśli pojawi się jako ciąg, który może zawierać reprezentację prawidłowej liczby, możesz użyć
class String
def valid_float?
true if Float self rescue false
end
end
a następnie '12'.valid_float?zwróci wartość true, jeśli możesz przekonwertować ciąg na prawidłową liczbę zmiennoprzecinkową (np. za pomocą to_f).
Fixnumnie działa z pływakami. Jednak Numericdziała dobrze. Więc 1.234.is_a? Fixnum == false, ale 1.234.is_a? Numeric == true.
1.1.is_a? NumericZobacz stackoverflow.com/a/17668654/76486
pry(main)> '12'.is_a? Numeric => false
'12'to String. W takim przypadku sprawdź ciąg za pomocą Regex lub innego możliwego rozwiązania.
Obecnie zwykle używam po prostu liczb Integer i Float.
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
Możesz dodać:
validates_numericality_of :the_field
w swoim modelu.
Zobacz: http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002172
Po prostu dwukrotnie przekonwertuj ciąg:
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” vs „7,0”)
num == num.to_i.to_s || num == num.to_f.to_s
Sugerowałbym ten
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
Wartości ciągów zawsze są konwertowane na 0 z .to_i
[14] pry(main)> 'Apple'.to_i > 0
=> false
[15] pry(main)> '101'.to_i > 0
=> true