I tried by converting the arguments name to string after that change, this is also working fine @m1b !
var filesB =[];
var myfile=Folder.selectDialog();
var fileList =myfile.getFiles();
filesB = fileList.sort(sortStringByPaddingNumbers);
for (i = 0; i < filesB.length; i++) {
$.writeln(filesB[i]);
}
/**
* Sorter function that adds
* leading zeros to all numbers
* so they sort better.
* m1b
* 2022-11-01
* {String} a - a string to order.
* {String} b - a string to order.
* {Number} - sort result (-1, 0, or 1).
*/
function sortStringByPaddingNumbers(a, b) {
c = String(a.name);
d= String(b.name);
var aParts = c.split(/(\d+)/),
bParts = d.split(/(\d+)/),
len = Math.max(aParts.length, bParts.length);
for (var i = 0; i < len; i++) {
if (aParts[i].length === bParts[i].length)
continue;
var an = Number(aParts[i]),
bn = Number(bParts[i]);
if (an === an)
aParts[i] = ('0000000000' + aParts[i]).slice(-10);
if (bn === bn)
bParts[i] = ('0000000000' + bParts[i]).slice(-10);
}
c = aParts.join('');
d = bParts.join('');
if (c < d) return -1;
if (c > d) return 1;
return 0;
};
Hey, very well done on fixing it! For information, here is my preferred way below. Also note I made a mistake on the sorter function: please change Math.max to Math.min. This will throw error in some cases.
- Mark
var myfile = Folder.selectDialog();
if (myfile) {
var fileList = myfile.getFiles();
fileList.sort(function (a, b) { return sortStringByPaddingNumbers(a.displayName, b.displayName) });
for (i = 0; i < fileList.length; i++)
$.writeln(fileList[i].displayName);
}
/**
* Sorter function that adds
* leading zeros to all numbers
* so they sort better.
* @7111211 m1b
* @version 2022-11-01
* @9397041 {String} a - a string to order.
* @9397041 {String} b - a string to order.
* @Returns {Number} - sort result (-1, 0, or 1).
*/
function sortStringByPaddingNumbers(a, b) {
var aParts = a.split(/(\d+)/),
bParts = b.split(/(\d+)/),
len = Math.min(aParts.length, bParts.length);
for (var i = 0; i < len; i++) {
if (aParts[i].length === bParts[i].length)
continue;
var an = Number(aParts[i]),
bn = Number(bParts[i]);
if (an === an)
aParts[i] = ('0000000000' + aParts[i]).slice(-10);
if (bn === bn)
bParts[i] = ('0000000000' + bParts[i]).slice(-10);
}
a = aParts.join('');
b = bParts.join('');
if (a < b) return -1;
if (a > b) return 1;
return 0;
};