JSFiddle - React, Tailwind, and code Playground
HTML
Standard test case.
<xmp id="a"></xmp>
<p/>
Test case with leading zeros.
<xmp id="b"></xmp>
CSS
xmp {background-color: #eee}
JavaScript
function alphanum(a, b) {
function isdigit(ch) {
return '0' <= ch && ch <= '9';
}
var min = Math.min(a.length, b.length);
for (var i = 0; i < min; i++) {
if (a.charCodeAt(i) !== b.charCodeAt(i)) break;
}
if (i == min) return a.length - b.length;
if (isdigit(a[i])) {
if (isdigit(b[i])) {
if (a[i] === '0' || b[i] === '0') {
for (var z = i - 1; z > 0; z--) {
if (a[z] !== '0') break;
}
if (!isdigit(a[z])) z++;
if (a[z] === '0' || b[z] === '0') {
for (var j = i; ; j++) {
if (b[j] !== '0') break;
}
for (;; i++) {
if (a[i] !== '0') break;
}
if (!isdigit(a[i])) {
if (isdigit(b[j])) {
return -1;
} else {
return i - j;
}
} else if (!isdigit(b[j])) {
return 1;
} else {
var cmp = a.charCodeAt(i) - b.charCodeAt(j);
for (i++, j++;; i++, j++) {
if (!isdigit(a[i])) {
if (isdigit(b[j])) {
return -1;
} else {
if (cmp) return cmp;
return i - j;
}
} else if (!isdigit(b[j])) {
return 1;
}
}
}
}
}
var cmp = a.charCodeAt(i) - b.charCodeAt(i);
for (i++;; i++) {
if (!isdigit(a[i])) {
...