Space Ship Operator <=> Odd Behaviour

I have come across a strange occurance when I use the space ship
operator to compare percentages.

I want to compare percentages to see if they are greater than, less than
or equal to 85%, this mostly works fine - all the way up to 99% - it
returns a 1 obviously meaning that 99% is greater than 85%

however the strangeness comes in when I attempt to compare 100% or
greater against 85% - it returns -1

I am fairly new to ruby - by no means an expert so I suspect there is
something wrong with what I am doing rather than the spaceship operator.
Can someone please shine some light on this for me so that I may better
understand.

I have the knowledge to perform this operation another way with differnt
code, but I am interested to know why - if there is a logical
explaination.

Thanks in advance!

On Sep 27, 10:13 pm, Nathanial A. [email protected]
wrote:

I am fairly new to ruby - by no means an expert so I suspect there is
Posted viahttp://www.ruby-forum.com/.
that is because the sort being performed is alphanumeric instead of
numeric. In the example below, z has the correct sorted values. Due to
the way to_i is defined, ‘10%’.to_i is same as ‘10’.to_i.

x = [ ‘35%’, ‘25%’, ‘5%’, ‘10%’, ‘100%’, ‘15%’ ]
y = x.sort { |a,b| a <=> b }
z = x.sort { |a,b| a.to_i <=> b.to_i }
puts “x is:”
p x
puts “y is:”
p y
puts “z is:”
p z

Output:
x is:
[“35%”, “25%”, “5%”, “10%”, “100%”, “15%”]
y is:
[“10%”, “100%”, “15%”, “25%”, “35%”, “5%”]
z is:
[“5%”, “10%”, “15%”, “25%”, “35%”, “100%”]

On Tuesday 28 September 2010, Nathanial A. wrote:

|I am fairly new to ruby - by no means an expert so I suspect there is
|something wrong with what I am doing rather than the spaceship operator.
|Can someone please shine some light on this for me so that I may better
|understand.
|
|I have the knowledge to perform this operation another way with differnt
|code, but I am interested to know why - if there is a logical
|explaination.
|
|Thanks in advance!

What kind of object are you using to represent percentages? From the
way you
worded your question, I think you’re using strings, that is you’re
writing
something like

“99%” <=> “85%”

If this is the case, then it’s no wonder that “100%” <=> “85%” returns
-1: the
spaceship operator on strings compares them in alphabetical order, which
means
that “100%” should indeed came first. To compare the two numerical
values, you
have to convert them to numerical classes. How to do this depends on
your
exact needs. For example, if you’re sure that all your percentages are
integer
values, you can simply do something like:

perc_1=“100%”[0…-1].to_i
perc_2=“85%”[0…-1].to_i
perc_1 <=> perc_2

This should give you the correct result. If your percentages can be non
integers (i.e. “94.42%”), you’ll have to convert them to Float or
Rational.

I hope this helps

Stefano

On 09/28/2010 09:09 AM, Stefano C. wrote:

|

exact needs. For example, if you’re sure that all your percentages are integer
values, you can simply do something like:

perc_1=“100%”[0…-1].to_i
perc_2=“85%”[0…-1].to_i
perc_1<=> perc_2

This should give you the correct result. If your percentages can be non
integers (i.e. “94.42%”), you’ll have to convert them to Float or Rational.

Note: you don’t need the sub range with #to_i if the number is the
beginning:

irb(main):001:0> ‘123%’.to_i
=> 123

Kind regards

robert

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs