Fix big number causing NumberFormatException in NaturalComparator
This commit is contained in:
1 parent
62348433df
commit
2de859398b
2 files changed
+55
-4
No files matched your search
@@ -56,10 +56,7 @@ public class NaturalComparator implements Comparator<String> {
|
||||
|
||||
int result;
|
||||
if (isDigit(data1) && isDigit(data2)) {
|
||||
result = Long.compare(Long.valueOf(data1), Long.valueOf(data2));
|
||||
if (result == 0) {
|
||||
result = -Integer.compare(data1.length(), data2.length());
|
||||
}
|
||||
result = compareNumberString(data1, data2);
|
||||
} else {
|
||||
result = data1.compareToIgnoreCase(data2);
|
||||
}
|
||||
@@ -111,4 +108,45 @@ public class NaturalComparator implements Comparator<String> {
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
private static String removeLeadingZero(String s) {
|
||||
if (s.length() < 1) {
|
||||
return s;
|
||||
}
|
||||
|
||||
// At least keep the last number
|
||||
for (int i = 0, n = s.length() - 1; i < n; i++) {
|
||||
if (s.charAt(i) != '0') {
|
||||
return s.substring(i);
|
||||
}
|
||||
}
|
||||
|
||||
return s.substring(s.length() - 1);
|
||||
}
|
||||
|
||||
private static int compareNumberString(String s1, String s2) {
|
||||
String p1 = removeLeadingZero(s1);
|
||||
String p2 = removeLeadingZero(s2);
|
||||
|
||||
int l1 = p1.length();
|
||||
int l2 = p2.length();
|
||||
|
||||
if (l1 > l2) {
|
||||
return 1;
|
||||
} else if (l1 < l2) {
|
||||
return -1;
|
||||
} else {
|
||||
for (int i = 0; i < l1; i++) {
|
||||
char c1 = p1.charAt(i);
|
||||
char c2 = p2.charAt(i);
|
||||
if (c1 > c2) {
|
||||
return 1;
|
||||
} else if (c1 < c2) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -Integer.compare(s1.length(), s2.length());
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user