From f551f1f5e19f127ac0f2c44ef8865c48cbf49e86 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Thu, 15 Jun 2023 16:28:45 +1000 Subject: [PATCH] Sort special characters before numbers --- casefolded/natsort.go | 8 ++------ casefolded/natsort_test.go | 3 +++ natsort.go | 4 +--- natsort_test.go | 2 ++ 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/casefolded/natsort.go b/casefolded/natsort.go index 90dedda..cf7cd92 100644 --- a/casefolded/natsort.go +++ b/casefolded/natsort.go @@ -73,9 +73,7 @@ func NaturalLess(str1, str2 string) bool { dig1, dig2 := isDigit(c1), isDigit(c2) switch { - case dig1 != dig2: // Digits before other characters. - return dig1 // True if LHS is a digit, false if the RHS is one. - case !dig1: // && !dig2, because dig1 == dig2 + case !dig1 || !dig2: // For ASCII it suffices to normalize letters to upper-case, // because upper-cased ASCII compares lexicographically. // Note: this does not account for regional special cases @@ -132,9 +130,7 @@ hasUnicode: dig1, dig2 := isDigit(c1), isDigit(c2) switch { - case dig1 != dig2: // Digits before other characters. - return dig1 // True if LHS is a digit, false if the RHS is one. - case !dig1: // && !dig2, because dig1 == dig2 + case !dig1 || !dig2: idx1 += delta1 idx2 += delta2 // Fast path: identical runes are equal. diff --git a/casefolded/natsort_test.go b/casefolded/natsort_test.go index 470a190..4d77d0f 100644 --- a/casefolded/natsort_test.go +++ b/casefolded/natsort_test.go @@ -94,6 +94,9 @@ func TestNaturalLess(t *testing.T) { // Kelvin sign followed by numeric comparison {"\u212alm2", "Klm10", true}, {"Klm01", "\u212alm2", true}, + // Special characters + {"!", "1", true}, + {"!", "\u212alm2", true}, } for _, v := range testset { if got := NaturalLess(v.s1, v.s2); got != v.less { diff --git a/natsort.go b/natsort.go index e4f1511..aaea416 100644 --- a/natsort.go +++ b/natsort.go @@ -30,9 +30,7 @@ func NaturalLess(str1, str2 string) bool { c1, c2 := str1[idx1], str2[idx2] dig1, dig2 := isDigit(c1), isDigit(c2) switch { - case dig1 != dig2: // Digits before other characters. - return dig1 // True if LHS is a digit, false if the RHS is one. - case !dig1: // && !dig2, because dig1 == dig2 + case !dig1 || !dig2: // UTF-8 compares bytewise-lexicographically, no need to decode // codepoints. if c1 != c2 { diff --git a/natsort_test.go b/natsort_test.go index eae4424..a39297d 100644 --- a/natsort_test.go +++ b/natsort_test.go @@ -51,6 +51,8 @@ func TestNaturalLess(t *testing.T) { // {"082", "83", true}, {"9a", "083a", true}, + // Special characters + {"!", "1", true}, } for _, v := range testset { if got := NaturalLess(v.s1, v.s2); got != v.less {