Skip to content

Commit 55261be

Browse files
authored
Fix #1308: allow trailing dot for "Stringified numbers" (#1309)
1 parent 449ed86 commit 55261be

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

release-notes/VERSION-2.x

+5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ a pure JSON library.
1414
=== Releases ===
1515
------------------------------------------------------------------------
1616

17+
2.17.2 (not yet released)
18+
19+
#1308: Relax validation by `NumberInput.looksLikeValidNumber()` to allow
20+
trailing dot (like `3.`)
21+
1722
2.17.1 (04-May-2024)
1823

1924
#1241: Fix `NumberInput.looksLikeValidNumber()` implementation

src/main/java/com/fasterxml/jackson/core/io/NumberInput.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,22 @@ public final class NumberInput
3535
/**
3636
* Regexp used to pre-validate "Stringified Numbers": slightly looser than
3737
* JSON Number definition (allows leading zeroes, positive sign).
38-
*
38+
*
3939
* @since 2.17
4040
*/
4141
private final static Pattern PATTERN_FLOAT = Pattern.compile(
4242
"[+-]?[0-9]*[\\.]?[0-9]+([eE][+-]?[0-9]+)?");
4343

44+
45+
/**
46+
* Secondary regexp used along with {@code PATTERN_FLOAT} to cover
47+
* case where number ends with dot, like {@code "+12."}
48+
*
49+
* @since 2.17.2
50+
*/
51+
private final static Pattern PATTERN_FLOAT_TRAILING_DOT = Pattern.compile(
52+
"[+-]?[0-9]+[\\.]");
53+
4454
/**
4555
* Fast method for parsing unsigned integers that are known to fit into
4656
* regular 32-bit signed int type. This means that length is
@@ -589,6 +599,7 @@ public static boolean looksLikeValidNumber(final String s) {
589599
char c = s.charAt(0);
590600
return (c <= '9') && (c >= '0');
591601
}
592-
return PATTERN_FLOAT.matcher(s).matches();
602+
return PATTERN_FLOAT.matcher(s).matches()
603+
|| PATTERN_FLOAT_TRAILING_DOT.matcher(s).matches();
593604
}
594605
}

src/test/java/com/fasterxml/jackson/core/io/NumberInputTest.java

+33-4
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void parseBigIntegerFailsWithENotation()
7373
}
7474

7575
@Test
76-
void looksLikeValidNumber()
76+
void looksLikeValidNumberTrue()
7777
{
7878
assertTrue(NumberInput.looksLikeValidNumber("0"));
7979
assertTrue(NumberInput.looksLikeValidNumber("1"));
@@ -83,10 +83,11 @@ void looksLikeValidNumber()
8383

8484
// https://github.com/FasterXML/jackson-databind/issues/4435
8585
assertTrue(NumberInput.looksLikeValidNumber(".0"));
86+
assertTrue(NumberInput.looksLikeValidNumber("-.0"));
87+
assertTrue(NumberInput.looksLikeValidNumber("+.0"));
8688
assertTrue(NumberInput.looksLikeValidNumber(".01"));
87-
assertTrue(NumberInput.looksLikeValidNumber("+.01"));
8889
assertTrue(NumberInput.looksLikeValidNumber("-.01"));
89-
assertTrue(NumberInput.looksLikeValidNumber("-.0"));
90+
assertTrue(NumberInput.looksLikeValidNumber("+.01"));
9091

9192
assertTrue(NumberInput.looksLikeValidNumber("0.01"));
9293
assertTrue(NumberInput.looksLikeValidNumber("-0.10"));
@@ -104,11 +105,39 @@ void looksLikeValidNumber()
104105
assertTrue(NumberInput.looksLikeValidNumber("1.4E-45"));
105106
assertTrue(NumberInput.looksLikeValidNumber("1.4e+45"));
106107

108+
// https://github.com/FasterXML/jackson-core/issues/1308
109+
assertTrue(NumberInput.looksLikeValidNumber("0."));
110+
assertTrue(NumberInput.looksLikeValidNumber("6."));
111+
assertTrue(NumberInput.looksLikeValidNumber("65."));
112+
assertTrue(NumberInput.looksLikeValidNumber("654."));
113+
assertTrue(NumberInput.looksLikeValidNumber("65432."));
114+
assertTrue(NumberInput.looksLikeValidNumber("-0."));
115+
assertTrue(NumberInput.looksLikeValidNumber("-6."));
116+
assertTrue(NumberInput.looksLikeValidNumber("-65."));
117+
assertTrue(NumberInput.looksLikeValidNumber("-654."));
118+
assertTrue(NumberInput.looksLikeValidNumber("-65432."));
119+
assertTrue(NumberInput.looksLikeValidNumber("+0."));
120+
assertTrue(NumberInput.looksLikeValidNumber("+6."));
121+
assertTrue(NumberInput.looksLikeValidNumber("+65."));
122+
assertTrue(NumberInput.looksLikeValidNumber("+654."));
123+
assertTrue(NumberInput.looksLikeValidNumber("+65432."));
124+
}
125+
126+
@Test
127+
void looksLikeValidNumberFalse()
128+
{
129+
// https://github.com/FasterXML/jackson-databind/issues/4435 and
130+
// https://github.com/FasterXML/jackson-core/issues/1308
107131
assertFalse(NumberInput.looksLikeValidNumber(""));
108132
assertFalse(NumberInput.looksLikeValidNumber(" "));
109133
assertFalse(NumberInput.looksLikeValidNumber(" "));
110134
assertFalse(NumberInput.looksLikeValidNumber("."));
111-
assertFalse(NumberInput.looksLikeValidNumber("0."));
112135
assertFalse(NumberInput.looksLikeValidNumber("10_000"));
136+
assertFalse(NumberInput.looksLikeValidNumber("-"));
137+
assertFalse(NumberInput.looksLikeValidNumber("+"));
138+
assertFalse(NumberInput.looksLikeValidNumber("-."));
139+
assertFalse(NumberInput.looksLikeValidNumber("+."));
140+
assertFalse(NumberInput.looksLikeValidNumber("-E"));
141+
assertFalse(NumberInput.looksLikeValidNumber("+E"));
113142
}
114143
}

0 commit comments

Comments
 (0)