From: Stefano Crocco Date: 2010-09-28T16:09:18+09:00 Subject: Re: Space Ship Operator <=> Odd Behaviour 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. I hope this helps Stefano