diff --git a/__test__/sort.test.js b/__test__/sort.test.js index c30503f8..6869c52d 100644 --- a/__test__/sort.test.js +++ b/__test__/sort.test.js @@ -183,7 +183,7 @@ describe('Sort', function () { expect(list.items[4].values().val).toBe('car.mov') expect(list.items[5].values().val).toBe('my.string_41299.tif') }) - it('should show order of sorted floates (a bit wrong)', function () { + it('should show order of sorted floates', function () { i1.values({ val: '10.0401' }) i2.values({ val: '10.022' }) i3.values({ val: '10.021999' }) @@ -193,9 +193,9 @@ describe('Sort', function () { list.sort('val', { order: 'asc' }) expect(list.items[0].values().val).toBe('0003.123') expect(list.items[1].values().val).toBe('09.2123') - expect(list.items[2].values().val).toBe('10.022') - expect(list.items[3].values().val).toBe('10.0401') - expect(list.items[4].values().val).toBe('10.021999') + expect(list.items[2].values().val).toBe('10.021999') + expect(list.items[3].values().val).toBe('10.022') + expect(list.items[4].values().val).toBe('10.0401') expect(list.items[5].values().val).toBe('11.231') }) it('should sort IP addresses', function () { diff --git a/src/sort.js b/src/sort.js index 4e4b415f..58be05ae 100644 --- a/src/sort.js +++ b/src/sort.js @@ -77,12 +77,23 @@ module.exports = function (list) { } } else { sortFunction = function (itemA, itemB) { + var valueA = itemA.values()[options.valueName] + var valueB = itemB.values()[options.valueName] + if (valueA !== '' && valueB !== '') { + // Detect if the values are pure numbers and sort accordingly if they are + var numA = Number(valueA) + var numB = Number(valueB) + if (Number.isFinite(numA) && Number.isFinite(numB) && valueA == numA && valueB == numB) { + return (numA - numB) * multi + } + } + // Sort as strings var sort = list.utils.naturalSort sort.alphabet = list.alphabet || options.alphabet || undefined if (!sort.alphabet && options.insensitive) { sort = list.utils.naturalSort.caseInsensitive } - return sort(itemA.values()[options.valueName], itemB.values()[options.valueName]) * multi + return sort(valueA, valueB) * multi } }