From ca3af212deff2ff07b839fec91847cf61ad162e1 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sun, 11 Sep 2016 17:06:53 +1200 Subject: [PATCH] -Fixed double parsing bug --- .../Utilities/ConvertUtilsTests.cs | 6 ++++-- Src/Newtonsoft.Json/Utilities/ConvertUtils.cs | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Utilities/ConvertUtilsTests.cs b/Src/Newtonsoft.Json.Tests/Utilities/ConvertUtilsTests.cs index 531960fb..4088d58b 100644 --- a/Src/Newtonsoft.Json.Tests/Utilities/ConvertUtilsTests.cs +++ b/Src/Newtonsoft.Json.Tests/Utilities/ConvertUtilsTests.cs @@ -53,8 +53,8 @@ namespace Newtonsoft.Json.Tests.Utilities bool result2 = double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out d2) && !s.StartsWith(".") && !s.EndsWith(".") - && !(s.StartsWith("0") && s.Length > 1 && !s.StartsWith("0.")) - && !(s.StartsWith("-0") && s.Length > 2 && !s.StartsWith("-0.")) + && !(s.StartsWith("0") && s.Length > 1 && !s.StartsWith("0.") && !s.StartsWith("0e", StringComparison.OrdinalIgnoreCase)) + && !(s.StartsWith("-0") && s.Length > 2 && !s.StartsWith("-0.") && !s.StartsWith("-0e", StringComparison.OrdinalIgnoreCase)) && s.IndexOf(".e", StringComparison.OrdinalIgnoreCase) == -1; Assert.AreEqual(expectedResult, result); @@ -73,6 +73,8 @@ namespace Newtonsoft.Json.Tests.Utilities [Test] public void DoubleTryParse() { + AssertDoubleTryParse("0e-10", ParseResult.Success, 0e-10); + AssertDoubleTryParse("0E-10", ParseResult.Success, 0e-10); AssertDoubleTryParse("0.1", ParseResult.Success, 0.1); AssertDoubleTryParse("567.89", ParseResult.Success, 567.89); diff --git a/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs b/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs index 700cf299..5cd37c8e 100644 --- a/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs @@ -1318,17 +1318,17 @@ namespace Newtonsoft.Json.Utilities i++; if (i != end) { - if (chars[i] != '.') + c = chars[i]; + if (c == '.') { - return ParseResult.Invalid; + goto case '.'; } - if (i + 1 == end) + if (c == 'e' || c == 'E') { - return ParseResult.Invalid; + goto case 'E'; } - numDecimalStart = i + 1; - continue; + return ParseResult.Invalid; } }