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