Skip to content

Commit 70a779b

Browse files
authored
Add U.isJsonNumber(string).
1 parent a035f51 commit 70a779b

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

src/main/java/com/github/underscore/lodash/U.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2144,11 +2144,42 @@ private static Object makeObject(Object value) {
21442144
result = removeMinusesAndConvertNumbers((Map<String, Object>) value);
21452145
} else {
21462146
String stringValue = String.valueOf(value);
2147-
result = stringValue.matches("^-?\\d*([.eE])?\\d+$") ? Xml.stringToNumber(stringValue) : value;
2147+
result = isJsonNumber(stringValue) ? Xml.stringToNumber(stringValue) : value;
21482148
}
21492149
return result;
21502150
}
21512151

2152+
public static boolean isJsonNumber(final String string) {
2153+
boolean eFound = false;
2154+
boolean periodValid = true;
2155+
boolean pmValid = true;
2156+
boolean numberEncountered = false;
2157+
for (char ch : string.toCharArray()) {
2158+
if (pmValid) {
2159+
pmValid = false;
2160+
if (ch == '-') {
2161+
continue;
2162+
}
2163+
}
2164+
if (!eFound && (ch == 'e' || ch == 'E')) {
2165+
eFound = true;
2166+
periodValid = false;
2167+
pmValid = true;
2168+
numberEncountered = false;
2169+
continue;
2170+
}
2171+
if (periodValid && ch == '.') {
2172+
periodValid = false;
2173+
continue;
2174+
}
2175+
if (ch < '0' || ch > '9') {
2176+
return false;
2177+
}
2178+
numberEncountered = true;
2179+
}
2180+
return numberEncountered;
2181+
}
2182+
21522183
@SuppressWarnings("unchecked")
21532184
public static Map<String, Object> replaceSelfClosingWithNull(Map map) {
21542185
Map<String, Object> outMap = newLinkedHashMap();

src/test/java/com/github/underscore/lodash/LodashTest.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,12 +715,27 @@ public void removeMinusesAndConvertNumbers() {
715715
Map<String, Object> result4 = U.removeMinusesAndConvertNumbers(
716716
(Map<String, Object>) U.fromXml("<a><b c=\"1\"/></a>"));
717717
assertEquals("{a={b={c=1}}}", result4.toString());
718+
Map<String, Object> result5 = U.removeMinusesAndConvertNumbers(
719+
(Map<String, Object>) U.fromXml("<a><b c=\"-1e1\"/></a>"));
720+
assertEquals("{a={b={c=-10.0}}}", result5.toString());
721+
Map<String, Object> result6 = U.removeMinusesAndConvertNumbers(
722+
(Map<String, Object>) U.fromXml("<a><b c=\"-1E1\"/></a>"));
723+
assertEquals("{a={b={c=-10.0}}}", result6.toString());
724+
Map<String, Object> result7 = U.removeMinusesAndConvertNumbers(
725+
(Map<String, Object>) U.fromXml("<a><b c=\"1.a\"/></a>"));
726+
assertEquals("{a={b={c=1.a}}}", result7.toString());
727+
Map<String, Object> result8 = U.removeMinusesAndConvertNumbers(
728+
(Map<String, Object>) U.fromXml("<a><b c=\"1.-\"/></a>"));
729+
assertEquals("{a={b={c=1.-}}}", result8.toString());
730+
Map<String, Object> result9 = U.removeMinusesAndConvertNumbers(
731+
(Map<String, Object>) U.fromXml("<a><b c=\"+1ee\"/></a>"));
732+
assertEquals("{a={b={c=+1ee}}}", result9.toString());
718733
Map<String, Object> map = U.newLinkedHashMap();
719734
List<Object> list = U.newArrayList();
720735
list.add(U.newArrayList());
721736
map.put("list", list);
722-
Map<String, Object> result5 = U.removeMinusesAndConvertNumbers(map);
723-
assertEquals("{list=[[]]}", result5.toString());
737+
Map<String, Object> result10 = U.removeMinusesAndConvertNumbers(map);
738+
assertEquals("{list=[[]]}", result10.toString());
724739
}
725740

726741
@SuppressWarnings("unchecked")

0 commit comments

Comments
 (0)