From 76cf59509397beb4f5e3f30cf5e2b92d5dd891ca Mon Sep 17 00:00:00 2001 From: Jorge Ortiz Date: Thu, 7 Oct 2010 18:01:45 -0400 Subject: [PATCH] com.mongodb.util.JSON should parse doubles with exponents; closes JAVA-177 --- src/main/com/mongodb/util/JSON.java | 31 +++++++++++++++++++++++++++++++ src/test/com/mongodb/util/JSONTest.java | 2 ++ 2 files changed, 33 insertions(+), 0 deletions(-) diff --git a/src/main/com/mongodb/util/JSON.java b/src/main/com/mongodb/util/JSON.java index c07a566..ea83111 100644 --- a/src/main/com/mongodb/util/JSON.java +++ b/src/main/com/mongodb/util/JSON.java @@ -549,6 +549,10 @@ class JSONParser { isDouble = true; parseFraction(); break; + case 'e': case 'E': + isDouble = true; + parseExponent(); + break; default: break outer; } @@ -575,6 +579,33 @@ class JSONParser { case '5': case '6': case '7': case '8': case '9': pos++; break; + case 'e': case 'E': + parseExponent(); + break; + default: + break outer; + } + } + } + + /** + * Advances the pointer through the exponent. + */ + public void parseExponent() { + // get past E + pos++; + + if(check('-') || check('+')) { + pos++; + } + + outer: + while(pos < s.length()) { + switch(s.charAt(pos)) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + pos++; + break; default: break outer; } diff --git a/src/test/com/mongodb/util/JSONTest.java b/src/test/com/mongodb/util/JSONTest.java index f1dbdf8..a904bf2 100644 --- a/src/test/com/mongodb/util/JSONTest.java +++ b/src/test/com/mongodb/util/JSONTest.java @@ -42,6 +42,8 @@ public class JSONTest extends com.mongodb.util.TestCase { assertEquals(JSON.serialize(JSON.parse("{'x' : 500.0 }")), "{ \"x\" : 500.0}"); assertEquals(JSON.serialize(JSON.parse("{'x' : 0.500 }")), "{ \"x\" : 0.5}"); assertEquals(JSON.serialize(JSON.parse("{'x' : 5. }")), "{ \"x\" : 5.0}"); + assertEquals(JSON.serialize(JSON.parse("{'x' : 5.0e+1 }")), "{ \"x\" : 50.0}"); + assertEquals(JSON.serialize(JSON.parse("{'x' : 5.0E-1 }")), "{ \"x\" : 0.5}"); } @org.testng.annotations.Test(groups = {"basic"}) -- 1.7.0.3