From: matt@... (matt neuburg) Date: 2009-03-28T11:46:38+09:00 Subject: Re: Sorting decimal index numbers? Aaron Vegh wrote: > Hi there, > I'm working with a list of items that contain decimal-based index > numbers. I'm sorry I don't know the term for these kinds of numbers, and > I'm having trouble finding out how to sort them properly. To wit: > > 1.1 > 1.10 > 1.2 > 1.3 > 1.4 > 1.5 > 1.6 > 1.7 > 1.8 > 1.9 > > When the index numbers are float or strings, they sort like this. But I > want "1.10" to be the last number. Any idea how to put these guys in the > right order? These are not numbers; they're strings. Or at least, they need to be; if they weren't, 1.1 and 1.10 would be indistinguishable. So let's assume they *are* strings. Then what you're asking to do is to compare the two halves of each string as an integer. Take 1.1 and 2.1, for instance; they compare as 1 and 2 would compare as integers. Very well, now take 1.10 and 1.2, for instance. 1 and 1 are the same, so 10 and 2 need to compare as the integers 10 and 2. So: arr = %w{ 1.1 1.10 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 } arr = arr.sort do |x,y| x1, x2 = x.split(".") y1, y2 = y.split(".") if x1 != y1 x1.to_i <=> y1.to_i else x2.to_i <=> y2.to_i end end p arr If there are a lot of these, however, it would be much better to do a keyed sort using sort_by. How to create keys depends on what you know about the data. If we knew for a fact that the second half was always between 1 and 99, it would be easy: arr = arr.sort_by do |x| x1, x2 = x.split(".") x1.to_i * 100 + x2.to_i end If the second half can be any length, though, you'll have to determine the maximum length first, and change that "100" multiplier accordingly. m. -- matt neuburg, phd = matt@tidbits.com, http://www.tidbits.com/matt/ Leopard - http://www.takecontrolbooks.com/leopard-customizing.html AppleScript - http://www.amazon.com/gp/product/0596102119 Read TidBITS! It's free and smart. http://www.tidbits.com