From: Robert Klemme Date: 2010-09-30T15:15:16+09:00 Subject: Re: Space Ship Operator <=> Odd Behaviour On 09/28/2010 09:09 AM, Stefano Crocco wrote: > On Tuesday 28 September 2010, Nathanial Allan wrote: >> |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! > > 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. 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