2010-01-19 18 views
64

Ich möchte einfach überprüfen, ob ein zurückgegebener Wert aus einem Formularfelder eine Zahl ist, nämlich: 12, 12.5 oder 12.75. Gibt es eine einfache Möglichkeit, dies zu überprüfen, insbesondere wenn der Wert als param gezogen wird?Wie kann ich überprüfen, ob ein Wert eine Zahl ist?

+0

um, die einzige Sache ist, dass der Code für is_a_number funktioniert? funktioniert mit der einzigen Ausnahme ist. 02, oder .3 Zahlen .... – user211662

+5

Ich bevorzuge diese Lösung: http://StackOverflow.com/Questions/5661466/Test-if-String-is-Anumber-in- ruby-on-rails/5661695 Ich weiß nicht, warum so viele Leute denken, eine Regexp wäre dafür besser. –

Antwort

20

Nur regexp es, es ist trivial, und nicht wert, über darüber hinaus zu denken:

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

(Fest nach Justins Kommentar)

+5

In Ruby bezeichnen^und $ den Anfang/das Ende einer Zeile, nicht einer Zeichenfolge. Dies macht es unwirksam, als Mittel zur Bereinigung von Eingaben zu verwenden (siehe http://guides.rubyonrails.org/security.html#regular-expressions). Ein besserer Ansatz wäre: 'v.to_s = ~/\ A [- +]? \ D * \.? \ D + \ z /'. – Justin

+10

das ist nicht trivial, denke an jemanden, der nicht so erfahren ist! –

152

können Sie verwenden

12.is_a? Numeric 

(Numeric für ganze Zahlen und Schwimmer arbeiten.)

Wenn es als String kommt, die eine Darstellung einer gültigen Zahl enthalten könnten, könnten Sie

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

und dann '12'.valid_float? wird True zurückgegeben, wenn Sie die Zeichenfolge in eine gültige Gleitkomma (z. B. mit to_f) konvertieren können.

+4

basierend auf dem Titel, dachte ich, das war für Ruby (nicht Schienen) ... – Peter

+0

Sorry, das ist Ruby on Rails ... Grundsätzlich möchte ich nur in der Lage sein, jede Eingabe vom Benutzer zu bewerten, ob es sein soll. 03 0.3, 2.2 Die letzten beiden funktionieren, aber ich muss den ersten Eingang arbeiten: S – user211662

+10

'' '' Fixnum''' scheint nicht mit Floats zu arbeiten. '' 'Numeric''' funktioniert jedoch einwandfrei. Also '' '1.234.is_a? Fixnum == false''', aber '' '1.234.is_a? Numerisch == true'''. – KurtPreston

5

Ich würde vorschlagen, dieses

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 
+0

Funktioniert nicht für Float :: INFINITY –

20

Normalerweise verwende ich Integer und Float in diesen Tagen.

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 
6
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 
+5

"1.1" .is_a? Numerisch => false – Waclock

+0

Wie würden Sie das String-Konvertierungsproblem lösen? OP gibt an, dass es aus einem Textfeld stammt. – schlingel

-3

String-Werte konvertieren immer auf 0 mit .to_i

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

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

Was ist mit Kanten Fällen? Wenn die Zahl 0 oder negativ ist, wird Ihr Test ein falsches Negativ ergeben. – tsikov

+0

Noch schlimmer '1AB2'.to_i würde 1 für etwas zurückgeben, das eindeutig keine Ganzzahl ist ... –

5

konvertieren Nur Zeichenfolge zweimal:

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

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

Funktioniert nicht so schlecht mit Ganzzahlen, aber es gibt so viele Möglichkeiten zu scheitern, wenn Sie diesen Ratschlag mit Gleitkommazahlen befolgen wollen (was ist worum die Frage geht: '" 7 "==" 7 ".to_f.to_s # => false' (" 7 "vs" 7.0 ") –

Verwandte Themen