Skip to content

Commit 49463bc

Browse files
committed
workaround bug in FastDoubleParser
1 parent 89b2381 commit 49463bc

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ private BigDecimalParser() {}
4040
* @throws NumberFormatException
4141
*/
4242
public static BigDecimal parse(String valueStr) {
43-
return parse(valueStr.toCharArray());
43+
if (valueStr.length() < 500) {
44+
return new BigDecimal(valueStr);
45+
}
46+
// workaround https://github.com/FasterXML/jackson-databind/issues/4694
47+
return JavaBigDecimalParser.parseBigDecimal(valueStr);
4448
}
4549

4650
/**
@@ -58,7 +62,8 @@ public static BigDecimal parse(final char[] chars, final int off, final int len)
5862
if (len < 500) {
5963
return new BigDecimal(chars, off, len);
6064
}
61-
return JavaBigDecimalParser.parseBigDecimal(chars, off, len);
65+
// workaround https://github.com/FasterXML/jackson-databind/issues/4694
66+
return JavaBigDecimalParser.parseBigDecimal(new String(chars, off, len));
6267

6368
// 20-Aug-2022, tatu: Although "new BigDecimal(...)" only throws NumberFormatException
6469
// operations by "parseBigDecimal()" can throw "ArithmeticException", so handle both:

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.math.BigDecimal;
44

5+
import ch.randelshofer.fastdoubleparser.JavaBigDecimalParser;
56
import org.junit.jupiter.api.Test;
67

78
import static org.junit.jupiter.api.Assertions.*;
@@ -51,6 +52,16 @@ void longValidStringFastParse() {
5152
assertEquals(EXP, BigDecimalParser.parseWithFastParser(num.toCharArray(), 0, num.length()));
5253
}
5354

55+
@Test
56+
void issueDatabind4694() {
57+
final String str = "-11000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
58+
final BigDecimal expected = new BigDecimal(str);
59+
assertEquals(expected, JavaBigDecimalParser.parseBigDecimal(str));
60+
assertEquals(expected, BigDecimalParser.parse(str));
61+
final char[] arr = str.toCharArray();
62+
assertEquals(expected, BigDecimalParser.parse(arr, 0, arr.length));
63+
}
64+
5465
static String genLongInvalidString() {
5566
final int len = 1500;
5667
final StringBuilder sb = new StringBuilder(len);

0 commit comments

Comments
 (0)