Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rails convert string to number

I am wondering what is a convenient function in Rails to convert a string with a negative sign into a number. e.g. -1005.32

When I use the .to_f method, the number becomes 1005 with the negative sign and decimal part being ignored.

like image 845
Yang Avatar asked May 06 '10 02:05

Yang


People also ask

What is TO_S in Ruby?

The to_s function in Ruby returns a string containing the place-value representation of int with radix base (between 2 and 36). If no base is provided in the parameter then it assumes the base to be 10 and returns.

How do I convert a string to an array in Ruby?

The general syntax for using the split method is string. split() . The place at which to split the string is specified as an argument to the method. The split substrings will be returned together in an array.


2 Answers

.to_f is the right way.

Example:

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

Maybe your string does not include a regular "-" (dash)? Or is there a space between the dash and the first numeral?

Added:

If you know that your input string is a string version of a floating number, eg, "10.2", then .to_f is the best/simplest way to do the conversion.

If you're not sure of the string's content, then using .to_f will give 0 in the case where you don't have any numbers in the string. It will give various other values depending on your input string too. Eg

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

The above .to_f behavior may be just what you want, it depends on your problem case.

Depending on what you want to do in various error cases, you can use Kernel::Float as Mark Rushakoff suggests, since it raises an error when it is not perfectly happy with converting the input string.

like image 142
Larry K Avatar answered Oct 16 '22 08:10

Larry K


You should be using Kernel::Float to convert the number; on invalid input, this will raise an error instead of just "trying" to convert it.

>> "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
like image 43
Mark Rushakoff Avatar answered Oct 16 '22 07:10

Mark Rushakoff