Skip to content

Commit 7902535

Browse files
authored
uptake FastDoubleParser v1.0.1 (#1331)
1 parent a808f5e commit 7902535

File tree

6 files changed

+66
-57
lines changed

6 files changed

+66
-57
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ com.fasterxml.jackson.core.*;version=${project.version}
299299
<dependency>
300300
<groupId>ch.randelshofer</groupId>
301301
<artifactId>fastdoubleparser</artifactId>
302-
<version>1.0.0</version>
302+
<version>1.0.1</version>
303303
</dependency>
304304
<!-- Test dependencies -->
305305
<dependency>

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

+14-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
public final class BigDecimalParser
2626
{
2727
final static int MAX_CHARS_TO_REPORT = 1000;
28+
private final static int SIZE_FOR_SWITCH_TO_FASTDOUBLEPARSER = 500;
2829

2930
private BigDecimalParser() {}
3031

@@ -40,7 +41,17 @@ private BigDecimalParser() {}
4041
* @throws NumberFormatException
4142
*/
4243
public static BigDecimal parse(String valueStr) {
43-
return parse(valueStr.toCharArray());
44+
try {
45+
if (valueStr.length() < SIZE_FOR_SWITCH_TO_FASTDOUBLEPARSER) {
46+
return new BigDecimal(valueStr);
47+
}
48+
return JavaBigDecimalParser.parseBigDecimal(valueStr);
49+
50+
// 20-Aug-2022, tatu: Although "new BigDecimal(...)" only throws NumberFormatException
51+
// operations by "parseBigDecimal()" can throw "ArithmeticException", so handle both:
52+
} catch (ArithmeticException | NumberFormatException e) {
53+
throw _parseFailure(e, valueStr);
54+
}
4455
}
4556

4657
/**
@@ -55,7 +66,7 @@ public static BigDecimal parse(String valueStr) {
5566
*/
5667
public static BigDecimal parse(final char[] chars, final int off, final int len) {
5768
try {
58-
if (len < 500) {
69+
if (len < SIZE_FOR_SWITCH_TO_FASTDOUBLEPARSER) {
5970
return new BigDecimal(chars, off, len);
6071
}
6172
return JavaBigDecimalParser.parseBigDecimal(chars, off, len);
@@ -165,4 +176,5 @@ private static String _generateExceptionMessage(final String valueToReport, fina
165176
return String.format("Value %s can not be deserialized as `java.math.BigDecimal`, reason: %s" ,
166177
valueToReport, desc);
167178
}
179+
168180
}

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

+13
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,18 @@ 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+
assertEquals(expected, BigDecimalParser.parseWithFastParser(str));
62+
final char[] arr = str.toCharArray();
63+
assertEquals(expected, BigDecimalParser.parse(arr, 0, arr.length));
64+
assertEquals(expected, BigDecimalParser.parseWithFastParser(arr, 0, arr.length));
65+
}
66+
5467
static String genLongInvalidString() {
5568
final int len = 1500;
5669
final StringBuilder sb = new StringBuilder(len);

src/test/java/com/fasterxml/jackson/core/read/NumberParsingTest.java

+38
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ protected JsonFactory jsonFactory() {
2828
return sharedStreamFactory();
2929
}
3030

31+
private final String ISSUE_4694_VALUE =
32+
"-11000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
33+
3134
/*
3235
/**********************************************************************
3336
/* Tests, Boolean
@@ -996,6 +999,41 @@ void negativeMaxNumberLength() {
996999
}
9971000
}
9981001

1002+
// https://github.com/FasterXML/jackson-databind/issues/4694
1003+
@Test
1004+
void databind4694() throws Exception {
1005+
final BigDecimal expected = new BigDecimal(ISSUE_4694_VALUE);
1006+
for (int mode : ALL_MODES) {
1007+
try (JsonParser p = createParser(mode, String.format(" %s ", ISSUE_4694_VALUE))) {
1008+
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
1009+
assertEquals(expected, p.getDecimalValue());
1010+
assertFalse(p.isNaN());
1011+
}
1012+
}
1013+
}
1014+
1015+
void databind4694Double() throws Exception {
1016+
final Double expected = new Double(ISSUE_4694_VALUE);
1017+
for (int mode : ALL_MODES) {
1018+
try (JsonParser p = createParser(mode, String.format(" %s ", ISSUE_4694_VALUE))) {
1019+
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
1020+
assertEquals(expected, p.getDoubleValue());
1021+
assertFalse(p.isNaN());
1022+
}
1023+
}
1024+
}
1025+
1026+
void databind4694Float() throws Exception {
1027+
final Float expected = new Float(ISSUE_4694_VALUE);
1028+
for (int mode : ALL_MODES) {
1029+
try (JsonParser p = createParser(mode, String.format(" %s ", ISSUE_4694_VALUE))) {
1030+
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
1031+
assertEquals(expected, p.getFloatValue());
1032+
assertFalse(p.isNaN());
1033+
}
1034+
}
1035+
}
1036+
9991037
/*
10001038
/**********************************************************
10011039
/* Helper methods

src/test/java/com/fasterxml/jackson/failing/BigDecimalParser4694Test.java

-25
This file was deleted.

src/test/java/com/fasterxml/jackson/failing/NumberParsing4694Test.java

-29
This file was deleted.

0 commit comments

Comments
 (0)