2010-05-06 10 views
43

Ich frage mich, was ist eine bequeme Funktion in Rails, um eine Zeichenfolge mit einem negativen Vorzeichen in eine Zahl zu konvertieren. z.B. -1005.32Schienen konvertieren Zeichenfolge zu Nummer

Wenn ich die Methode .to_f verwende, wird die Nummer 1005, wobei das negative Vorzeichen und der Dezimalteil ignoriert werden.

+0

Speichern Sie das Ergebnis in einem int statt in einem Float? – Shaji

Antwort

66

.to_f ist der richtige Weg.

Beispiel:

irb(main):001:0> "-10".to_f 
=> -10.0 
irb(main):002:0> "-10.33".to_f 
=> -10.33 

Vielleicht Zeichenfolge enthält keine regelmäßigen "-" (Bindestrich)? Oder gibt es einen Abstand zwischen dem Strich und der ersten Zahl?

Hinzugefügt:

Wenn Sie wissen, dass Ihr Eingabestring eine String-Version von einer schwimmenden Zahl, zB „10.2“, dann ist .to_f der beste/einfachste Weg, um die Konvertierung zu tun.

Wenn Sie die Zeichenfolge des Inhalts nicht sicher sind, dann .to_f verwendet, wird 0 in dem Fall geben, wo Sie in der Zeichenfolge keine Zahlen nicht haben. Je nach Eingabestring gibt es verschiedene andere Werte. ZB

irb(main):001:0> "".to_f 
=> 0.0 
irb(main):002:0> "hi!".to_f 
=> 0.0 
irb(main):003:0> "4 you!".to_f 
=> 4.0 

Das obige .to_f Verhalten nur sein kann, was Sie wollen, hängt es von Ihrem Problemfall.

Je nachdem, was Sie in verschiedenen Fehlerfällen tun möchten, können Sie Kernel::Float verwenden, wie Mark Ruschakoff vorschlägt, da es einen Fehler auslöst, wenn es mit der Konvertierung der Eingabezeichenfolge nicht vollkommen zufrieden ist.

24

Sie sollten Kernel::Float verwenden, um die Nummer zu konvertieren; Bei ungültiger Eingabe wird dies einen Fehler auslösen, anstatt nur zu versuchen, es zu konvertieren.

>> "10.5".to_f 
=> 10.5 
>> "asdf".to_f # do you *really* want a zero for this? 
=> 0.0 
>> Float("asdf") 
ArgumentError: invalid value for Float(): "asdf" 
    from (irb):11:in `Float' 
    from (irb):11 
>> Float("10.5") 
=> 10.5 
+4

Eines der schönen Dinge über 'Float()' im Gegensatz zu 'Integer' ist, dass ersteres' 010' nicht in '8' konvertiert (Integer betrachtet etwas, beginnend mit' 0' als oktal) –

+0

@AndrewGrimm Oder du könnte als zweites Argument einfach die korrekte Basis übergeben: 'Integer (" 010 ", 10) # => 10' (Siehe [' Kernel # integer'] (http://ruby-doc.org/core/Kernel). html # Methode-i-Integer)) – Ajedi32

Verwandte Themen