-- alphanum.lua (C) Andre Bogus --[[ based on the python version of ned batchelder Distributed under same license as original This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ]] -- split a string into a table of number and string values function splitbynum(s) local result = {} for x, y in (s or ""):gmatch("(%d*)(%D*)") do if x ~= "" then table.insert(result, tonumber(x)) end if y ~= "" then table.insert(result, y) end end return result end -- compare two strings function alnumcomp(x, y) local xt, yt = splitbynum(x), splitbynum(y) for i = 1, math.min(#xt, #yt) do local xe, ye = xt[i], yt[i] if type(xe) == "string" then ye = tostring(ye) elseif type(ye) == "string" then xe = tostring(xe) end if xe ~= ye then return xe < ye end end return #xt < #yt end -- sort a given table of strings the way humans would expect function sortnicely(t) return table.sort(t, alnumcomp) end unsorted = {"1000X Radonius Maximus","10X Radonius","200X Radonius","20X Radonius","20X Radonius Prime","30X Radonius","40X Radonius","Allegia 50 Clasteron","Allegia 500 Clasteron","Allegia 51 Clasteron","Allegia 51B Clasteron","Allegia 52 Clasteron","Allegia 60 Clasteron","Alpha 100","Alpha 2","Alpha 200","Alpha 2A","Alpha 2A-8000","Alpha 2A-900","Callisto Morphamax","Callisto Morphamax 500","Callisto Morphamax 5000","Callisto Morphamax 600","Callisto Morphamax 700","Callisto Morphamax 7000","Callisto Morphamax 7000 SE","Callisto Morphamax 7000 SE2","QRS-60 Intrinsia Machine","QRS-60F Intrinsia Machine","QRS-62 Intrinsia Machine","QRS-62F Intrinsia Machine","Xiph Xlater 10000","Xiph Xlater 2000","Xiph Xlater 300","Xiph Xlater 40","Xiph Xlater 5","Xiph Xlater 50","Xiph Xlater 500","Xiph Xlater 5000","Xiph Xlater 58"} sortnicely(unsorted) for _, s in ipairs(unsorted) do print(s) end