diff --git a/src/main/java/com/fasterxml/jackson/core/io/BigDecimalParser.java b/src/main/java/com/fasterxml/jackson/core/io/BigDecimalParser.java index 7e27d4fefd..4dada0f643 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/BigDecimalParser.java +++ b/src/main/java/com/fasterxml/jackson/core/io/BigDecimalParser.java @@ -8,28 +8,24 @@ public final class BigDecimalParser { private final char[] chars; - private final int off; private final int len; - BigDecimalParser(char[] chars, int off, int len) { + BigDecimalParser(char[] chars) { this.chars = chars; - this.off = off; - this.len = len; + len = chars.length; } BigDecimal parse() throws NumberFormatException { try { - if (len < 500) { - return new BigDecimal(chars, off, len); + if (chars.length < 500) { + return new BigDecimal(chars); } - int splitLen = len / 10; + int splitLen = chars.length / 10; return parseBigDecimal(splitLen); } catch (NumberFormatException e) { - String val = new String(chars, off, len); - - throw new NumberFormatException("Value \"" + val + "\" can not be represented as BigDecimal." + throw new NumberFormatException("Value \"" + new String(chars) + "\" can not be represented as BigDecimal." + " Reason: " + e.getMessage()); } } @@ -43,7 +39,7 @@ private BigDecimal parseBigDecimal(int splitLen) { int dotIdx = -1; int scale = 0; - for (int i = off; i < len; i++) { + for (int i = 0; i < len; i++) { char c = chars[i]; switch (c) { case '+': diff --git a/src/main/java/com/fasterxml/jackson/core/io/NumberInput.java b/src/main/java/com/fasterxml/jackson/core/io/NumberInput.java index c929fcf2f7..58e42c7479 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/NumberInput.java +++ b/src/main/java/com/fasterxml/jackson/core/io/NumberInput.java @@ -316,12 +316,15 @@ public static BigDecimal parseBigDecimal(String s) throws NumberFormatException return parseBigDecimal(ch); } - public static BigDecimal parseBigDecimal(char[] ch) throws NumberFormatException { - return parseBigDecimal(ch, 0, ch.length); + public static BigDecimal parseBigDecimal(char[] ch, int off, int len) throws NumberFormatException { + char[] copy = new char[len]; + System.arraycopy(ch, off, copy, 0, len); + + return parseBigDecimal(copy); } - public static BigDecimal parseBigDecimal(char[] ch, int off, int len) throws NumberFormatException { - BigDecimalParser parser = new BigDecimalParser(ch, off, len); + public static BigDecimal parseBigDecimal(char[] ch) throws NumberFormatException { + BigDecimalParser parser = new BigDecimalParser(ch); return parser.parse(); }