Ich möchte einfach überprüfen, ob ein zurückgegebener Wert aus einem Formulartextfeld eine Zahl ist, dh: 12, 12.5 oder 12.75. Gibt es eine einfache Möglichkeit, dies zu überprüfen, insbesondere wenn der Wert als gezogen wird param
?
Ich möchte einfach überprüfen, ob ein zurückgegebener Wert aus einem Formulartextfeld eine Zahl ist, dh: 12, 12.5 oder 12.75. Gibt es eine einfache Möglichkeit, dies zu überprüfen, insbesondere wenn der Wert als gezogen wird param
?
Antworten:
Regexp es einfach, es ist trivial und es lohnt sich nicht darüber nachzudenken:
v =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/
(Behoben gemäß Justins Kommentar)
v.to_s =~ /\A[-+]?\d*\.?\d+\z/
.
Sie können verwenden
12.is_a? Numeric
( Numeric
funktioniert für Ganzzahlen und Gleitkommazahlen.)
Wenn es als Zeichenfolge ankommt, die möglicherweise eine Darstellung einer gültigen Zahl enthält, können Sie es verwenden
class String
def valid_float?
true if Float self rescue false
end
end
und gibt dann '12'.valid_float?
true zurück, wenn Sie die Zeichenfolge in einen gültigen float konvertieren können (z to_f
. B. mit ).
Fixnum
scheint nicht mit Schwimmern zu funktionieren. Funktioniert jedoch Numeric
gut. Also 1.234.is_a? Fixnum == false
, aber 1.234.is_a? Numeric == true
.
1.1.is_a? Numeric
Siehe stackoverflow.com/a/17668654/76486
pry(main)> '12'.is_a? Numeric => false
'12'
ist ein String. Überprüfen Sie in diesem Fall die Zeichenfolge mit Regex oder einer anderen möglichen Lösung.
Normalerweise benutze ich heutzutage nur Integer und 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
Sie können Folgendes hinzufügen:
validates_numericality_of :the_field
in Ihrem Modell.
Siehe: http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002172
Konvertieren Sie den String einfach zweimal:
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
Ich würde diesen vorschlagen
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
String-Werte werden mit .to_i immer in 0 konvertiert
[14] pry(main)> 'Apple'.to_i > 0
=> false
[15] pry(main)> '101'.to_i > 0
=> true