2009-01-27 31 views
6

Ich versuche zu entscheiden, ob eine Zeichenfolge in Ruby eine Zahl ist. Dies ist mein CodeType Conversions in Ruby: Der "richtige" Weg?

whatAmI = "32.3a22" 
puts "This is always false " + String(whatAmI.is_a?(Fixnum)); 
isNum = false; 
begin 
    Float(whatAmI) 
    isNum = true; 
rescue Exception => e 
    puts "What does Ruby say? " + e 
    isNum = false; 
end 
puts isNum 

Ich weiß, dass ich es mit einem RegEx tun können, aber gibt es eine standardisierte Möglichkeit, es zu tun, dass ich fehle? Ich habe eine can_convert gesehen? Methode, aber ich habe es nicht zu haben.

Gibt es eine Möglichkeit, eine can_convert hinzuzufügen? Methode für alle Strings? Ich verstehe, dass es in Ruby möglich ist. Ich verstehe auch, dass dies völlig unnötig sein kann ...

Bearbeiten Die to_f Methoden funktionieren nicht, da sie nie eine Ausnahme werfen, sondern nur 0 zurückgeben, wenn es nicht klappt.

Antwort

9

Sie haben die richtige Idee. Es kann aber etwas kompakter gemacht werden:

isNum = Float(whatAmI) rescue nil 

Inlining "Rettung" macht großen Spaß. Klammern den Teil Sie retten, wenn Sie es in der Mitte mehr Sachen setzen, wie:

if (isNum = Float(whatAmI) rescue nil) && isNum > 20 
    ... 
+0

schön! das habe ich gebraucht. –

3

Ich weiß nicht über die can_convert Methode, aber in der Regel wird eine Klasse Methoden wie to_s, to_i, to_hash und so weiter definieren. Diese Methoden geben eine andere Darstellung des Objekts zurück, z. B. gibt eine to_s-Methode eine Zeichenfolgendarstellung eines Objekts zurück.

Wie für die tatsächliche Konvertierung, ich bin mir sicher, jemand anderes kann das besser beantworten als ich.

Wenn Sie sich fragen, ob Sie eine Methode zu allen Strings hinzufügen können, können Sie dies auch tun. Öffnen Sie einfach die Klasse String und fügen Sie sie hinzu!

class String 
    def can_convert? 
    ... 
    end 
end 

Edit: Strings Exponentialnotation enthält, durch to_f unterstützt werden.

>> "6.02e23".to_f 
=> 6.02e+23 
+0

Ich stimme der to_i Methode zu. Es gibt auch eine to_f-Methode. Die letztere "Anmerkung", über die String-Erweiterung, heißt Monkey Patching und wird dringend davon abgeraten! – xtofl

+0

Ja, ich dachte, es gibt eine andere Möglichkeit, um String zu ändern ... aber es könnte nur eine einzige Instanz von String sein, die geändert werden kann. –

+0

Sie können eine Singleton-Methode String oder ein String-Objekt hinzufügen, wenn Sie danach sind. – dylanfm

4

Dies könnte zu kritisch klingen, aber auf der Grundlage Ihrer Beschreibung, sind Sie mit ziemlicher Sicherheit etwas „falsch“ zu tun. .. Warum müssten Sie überprüfen, ob ein String eine gültige Darstellung eines Float ist, aber den String nicht wirklich konvertieren?

Dies ist nur eine Ahnung, aber es kann nützlich sein zu beschreiben, was Sie erreichen möchten. Es gibt wahrscheinlich einen "besseren" Weg.

Zum Beispiel möchten Sie möglicherweise den String in eine Datenbank einfügen und eine SQL-Anweisung mit String-Verkettung zusammenstellen. Es wäre besser, in einen Float zu konvertieren und vorbereitete Anweisungen zu verwenden.

Wenn Sie nur die "Form" der Zeichenfolge überprüfen müssen, wäre es vorzuziehen, einen regulären Ausdruck zu verwenden, da, wie Dylan darauf hingewiesen hat, ein Float beliebig oft dargestellt werden kann sei anständig.

Möglicherweise müssen Sie auch mit internationalen Eingaben umgehen, in Europa wird ein Komma anstelle eines Punktes als Dezimaltrenner verwendet, aber Ruby Floats müssen die (.) Verwenden.

+1

Die Frage entstand aus etwas Einfachem, das ich mit einem RegEx machen werde, nur um zu überprüfen, ob der String ein int ist (was eine ID bedeutet) oder nicht (eine Aktion wie "login"). Aber dann wurde ich neugierig ... –

+0

Danke für die Antwort. Ich denke, Sie haben Recht mit der Regex, und Sie haben definitiv Recht, dass dies wahrscheinlich nicht notwendig ist. –

Verwandte Themen