2010-05-06 18 views
43

Me pregunto cuál es una función conveniente en Rails para convertir una cadena con un signo negativo en un número. p.ej. -1005.32rieles convertir cadena al número

Cuando uso el método .to_f, el número se convierte en 1005 con el signo negativo y la parte decimal ignorados.

+0

¿Está almacenando el resultado en un int en lugar de un float? – Shaji

Respuesta

66

.to_f es la manera correcta.

Ejemplo:

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

Tal vez su cadena no incluye un habitual "-" (guión)? ¿O hay un espacio entre el tablero y el primer número?

Agregado:

Si sabe que su cadena de entrada es una versión de cadena de un número flotante, por ejemplo, "10.2", entonces .to_f es la mejor manera de/simple de hacer la conversión.

Si no está seguro del contenido de la cadena, usar .to_f dará 0 en el caso en que no tenga ningún número en la cadena. Le dará varios otros valores dependiendo de su cadena de entrada también. Por ejemplo

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 

El .to_f comportamiento anterior puede ser justo lo que quiere, que depende de su caso problema.

Según lo que desee hacer en varios casos de error, puede usar Kernel::Float como sugiere Mark Rushakoff, ya que genera un error cuando no está completamente satisfecho con la conversión de la cadena de entrada.

24

Debe usar Kernel::Float para convertir el número; en una entrada no válida, esto generará un error en lugar de simplemente "intentar" convertirlo.

>> "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

Una de las cosas buenas de 'Float()' frente a 'Integer' es que la primera no convierte' 010' en '8' (Integer considera algo que comienza con' 0' como octal) –

+0

@AndrewGrimm O usted podría simplemente pasar la base correcta como el segundo argumento: 'Entero (" 010 ", 10) # => 10' (Ver [' Kernel # integer'] (http://ruby-doc.org/core/Kernel. html # method-i-Integer)) – Ajedi32

Cuestiones relacionadas