2010-12-27 26 views
2

Was ist der einfachste Weg, in Rails 3 herauszufinden, ob eine Zeichenkette str eine positive Gleitkommazahl enthält oder nicht? (str ist kein Attribut in einem aktiven Rekordmodell)Wie ermittelt man, ob eine Zeichenfolge eine Zahl ist?

Es sollte so funktionieren:

str = "123"   =>  true 
str = "123.456"  =>  true 
str = "0"   =>  true 
str = ""   =>  false 
str = "abcd"  =>  false 
str = "-123"  =>  false 
+0

Duplikat von http://stackoverflow.com/questions/1034418/determine-if-a-string-is-a-valid-float-value (für Floats) und http://stackoverflow.com/questions/ 4282273/does-ruby-1-9-2-haben-eine-ist-eine-funktion/428229 9 (für Ganzzahlen). BTW, 123 ist kein Float, es ist ein Integer. –

Antwort

7

Hier ist eine Idee:

class String 
    def nonnegative_float? 
    Float(self) >= 0 
    rescue ArgumentError 
    return false 
    end 
end 

Da Sie jedoch bereits eine ziemlich gute Vorstellung davon, was eine nicht negative Fließkommazahl sieht aus wie zu haben scheinen, Sie es auch gegen einen Regexp passen könnte:

class String 
    def nonnegative_float? 
    !!match(/\A\+?\d+(?:\.\d+)?\Z/) 
    end 
end 
+0

Beachten Sie, dass ".123" nicht zulässig ist. Obwohl dies als Ruby-Literal-Float ungültig ist, vermute ich, dass dies häufig bei Benutzereingaben auftreten kann. – Phrogz

+3

@Phrogz: Leider ist die Anforderungsspezifikation des OPs * unglaublich * vage und seine Testabdeckung ist auch nicht gerade toll, also ist es im Grunde Rätselraten. Sie nehmen an, dass ".123" gültig ist, obwohl es keinen Testfall dafür gibt. Ich nehme an, dass "+ 123" gültig ist und "123" nicht, obwohl es keine Testfälle dafür gibt. Eine bessere Antwort würde grundsätzlich eine bessere Frage erfordern. –

0

Sie können es gegen einen regulären Ausdruck übereinstimmen.

str === /^\d+(\.\d+)?$/ 
+1

Diese Regexp ist übermäßig breit und erlaubt sowohl negative Zahlen als auch Dinge wie 'u saugen d00d'. – Phrogz

+0

Sie haben Recht, ich habe vergessen, die Anfangs- und Endanker hinzuzufügen. Jetzt behoben. – edgerunner

Verwandte Themen