From e9f770e3f4d65adf9c4549ccdce6f812b0b8a2b4 Mon Sep 17 00:00:00 2001 From: Andrew Smithson Date: Mon, 8 Mar 2021 16:46:57 +0000 Subject: [PATCH] Support large numbers Signed-off-by: Andrew Smithson --- .../java/com/ibm/json/java/internal/Tokenizer.java | 14 ++++++++------ src/test/java/com/ibm/json4j/JSONNumberTest.java | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ibm/json/java/internal/Tokenizer.java b/src/main/java/com/ibm/json/java/internal/Tokenizer.java index c70167c..acb2ac3 100644 --- a/src/main/java/com/ibm/json/java/internal/Tokenizer.java +++ b/src/main/java/com/ibm/json/java/internal/Tokenizer.java @@ -17,6 +17,8 @@ import java.io.PushbackReader; import java.io.Reader; import java.io.StringReader; +import java.math.BigDecimal; +import java.math.BigInteger; /** * Tokenizes a stream into JSON tokens. @@ -301,7 +303,7 @@ private Number readNumber() throws IOException { try { if (-1 != string.indexOf('.')) { - return Double.valueOf(string); + return new BigDecimal(string); } String sign = ""; @@ -311,11 +313,11 @@ private Number readNumber() throws IOException { } if (string.toUpperCase().startsWith("0X")) { - return Long.valueOf(sign + string.substring(2), 16); + return new BigInteger(sign + string.substring(2), 16); } if (string.equals("0")) { - return Long.valueOf(0); + return BigInteger.ZERO; } /** @@ -323,14 +325,14 @@ private Number readNumber() throws IOException { * Exponentials should be treated as Doubles. */ if (string.indexOf("e") != -1 || string.indexOf("E") != -1) { - return Double.valueOf(sign + string); + return new BigDecimal(sign + string); } if (string.startsWith("0") && string.length() > 1) { - return Long.valueOf(sign + string.substring(1), 8); + return new BigInteger(sign + string.substring(1), 8); } - return Long.valueOf(sign + string, 10); + return new BigInteger(sign + string, 10); } catch (NumberFormatException e) { IOException iox = new IOException("Invalid number literal " + onLineCol(l, c)); iox.initCause(e); diff --git a/src/test/java/com/ibm/json4j/JSONNumberTest.java b/src/test/java/com/ibm/json4j/JSONNumberTest.java index b58afcb..97e3817 100644 --- a/src/test/java/com/ibm/json4j/JSONNumberTest.java +++ b/src/test/java/com/ibm/json4j/JSONNumberTest.java @@ -25,7 +25,7 @@ public class JSONNumberTest { * Test that a whole number larger than a 64bit whole number can be parsed. * @throws IOException If there is an error parsing the JSON */ - //@Test + @Test public void testLargeWholeNumber() throws IOException { String inputJson = "{\"number\":18446744073709551615}"; @@ -64,7 +64,7 @@ public void testDecimalNumber() throws IOException { * Test that a decimal number larger than a Java double can be parsed * @throws IOException If there is an error parsing the JSON */ - //@Test + @Test public void testLargeDecimalNumber() throws IOException { String inputJson = "{\"number\":2.0e500}";