From d0bdf09e7decfa3843226bccbbae17e5b89fa0ee Mon Sep 17 00:00:00 2001 From: Maurizio Cucchiara Date: Thu, 10 Nov 2011 16:51:46 +0000 Subject: [PATCH] WW-3701 - Wrong parsing of number with exponents git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@1200422 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/struts2/json/JSONReader.java | 10 +++- .../apache/struts2/json/JSONReaderTest.java | 47 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 plugins/json/src/test/java/org/apache/struts2/json/JSONReaderTest.java diff --git a/plugins/json/src/main/java/org/apache/struts2/json/JSONReader.java b/plugins/json/src/main/java/org/apache/struts2/json/JSONReader.java index 69be3a6db..affb4fbb8 100644 --- a/plugins/json/src/main/java/org/apache/struts2/json/JSONReader.java +++ b/plugins/json/src/main/java/org/apache/struts2/json/JSONReader.java @@ -176,6 +176,7 @@ class JSONReader { private Object number() { this.buf.setLength(0); + boolean toDouble = false; if (this.c == '-') { this.add(); @@ -184,11 +185,13 @@ class JSONReader { this.addDigits(); if (this.c == '.') { + toDouble = true; this.add(); this.addDigits(); } if ((this.c == 'e') || (this.c == 'E')) { + toDouble = true; this.add(); if ((this.c == '+') || (this.c == '-')) { @@ -198,8 +201,11 @@ class JSONReader { this.addDigits(); } - return (this.buf.indexOf(".") >= 0) ? (Object) Double.parseDouble(this.buf.toString()) - : (Object) Long.parseLong(this.buf.toString()); + if (toDouble) { + return Double.parseDouble(this.buf.toString()); + } else { + return Long.parseLong(this.buf.toString()); + } } private Object string(char quote) { diff --git a/plugins/json/src/test/java/org/apache/struts2/json/JSONReaderTest.java b/plugins/json/src/test/java/org/apache/struts2/json/JSONReaderTest.java new file mode 100644 index 000000000..ac253f5a2 --- /dev/null +++ b/plugins/json/src/test/java/org/apache/struts2/json/JSONReaderTest.java @@ -0,0 +1,47 @@ +package org.apache.struts2.json; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * User: mcucchiara + * Date: 10/11/11 + * Time: 17.26 + */ +public class JSONReaderTest { + private JSONReader reader = new JSONReader(); + + @Test + public void testExponentialNumber() throws Exception { + Object ret = reader.read("5e-5"); + assertNotNull(ret); + assertEquals(Double.class, ret.getClass()); + assertEquals(5.0E-5, ret); + } + + @Test + public void testExponentialNumber2() throws Exception { + Object ret = reader.read("123.4e10"); + assertNotNull(ret); + assertEquals(Double.class, ret.getClass()); + assertEquals(123.4e10, ret); + } + + @Test + public void testDecimalNumber() throws Exception { + Object ret = reader.read("3.2"); + assertNotNull(ret); + assertEquals(Double.class, ret.getClass()); + assertEquals(3.2, ret); + } + + @Test + public void testNaturalNumber() throws Exception { + Object ret = reader.read("123"); + assertNotNull(ret); + assertEquals(Long.class, ret.getClass()); + assertEquals(123L, ret); + } +}