1
2
3
4
5 package sgutil
6
7 import (
8 "strconv"
9 "strings"
10 )
11
12
13 func isDigit(b byte) bool {
14 return b >= '0' && b <= '9'
15 }
16
17
18
19
20
21
22
23
24
25
26
27 func CompareNatural(s1, s2 string) int {
28 i, j := 0, 0
29 len1, len2 := len(s1), len(s2)
30
31 for i < len1 && j < len2 {
32
33 if isDigit(s1[i]) && isDigit(s2[j]) {
34
35 numStart1 := i
36 for i < len1 && isDigit(s1[i]) {
37 i++
38 }
39 num1, _ := strconv.Atoi(s1[numStart1:i])
40
41 numStart2 := j
42 for j < len2 && isDigit(s2[j]) {
43 j++
44 }
45 num2, _ := strconv.Atoi(s2[numStart2:j])
46
47 if num1 < num2 {
48 return -1
49 }
50 if num1 > num2 {
51 return 1
52 }
53
54 if ln1, ln2 := i-numStart1, j-numStart2; ln1 != ln2 {
55 return ln1 - ln2
56 }
57
58 } else {
59
60 if s1[i] < s2[j] {
61 return -1
62 }
63 if s1[i] > s2[j] {
64 return 1
65 }
66 i++
67 j++
68 }
69 }
70
71
72 return strings.Compare(s1, s2)
73 }
74
View as plain text