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.
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%”]
|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: