This commit is contained in:
James Newton-King
2016-07-25 19:53:40 +12:00
parent fbcac63b1b
commit 4f86f6b79e
2 changed files with 28 additions and 2 deletions
@@ -50,7 +50,9 @@ namespace Newtonsoft.Json.Tests.Utilities
ParseResult result = ConvertUtils.DoubleTryParse(c, 0, c.Length, out d);
double d2;
bool result2 = double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out d2);
bool result2 = double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out d2)
&& !s.StartsWith(".")
&& s.IndexOf(".e", StringComparison.OrdinalIgnoreCase) == -1;
Assert.AreEqual(expectedResult, result);
Assert.AreEqual(expectedResult == ParseResult.Success, result2);
@@ -72,6 +74,7 @@ namespace Newtonsoft.Json.Tests.Utilities
AssertDoubleTryParse("567.89", ParseResult.Success, 567.89);
AssertDoubleTryParse("-567.89", ParseResult.Success, -567.89);
AssertDoubleTryParse("1E23", ParseResult.Success, 1E23);
AssertDoubleTryParse("1.1E23", ParseResult.Success, 1.1E23);
AssertDoubleTryParse("1E+23", ParseResult.Success, 1E+23);
AssertDoubleTryParse("1E-1", ParseResult.Success, 1E-1);
AssertDoubleTryParse("1E-2", ParseResult.Success, 1E-2);
@@ -92,6 +95,13 @@ namespace Newtonsoft.Json.Tests.Utilities
AssertDoubleTryParse("1E+309", ParseResult.Overflow, null);
AssertDoubleTryParse("-1E+5000", ParseResult.Overflow, null);
AssertDoubleTryParse(".1E23", ParseResult.Invalid, null);
AssertDoubleTryParse("1..1E23", ParseResult.Invalid, null);
AssertDoubleTryParse("1.E23", ParseResult.Invalid, null);
AssertDoubleTryParse("1E2.3", ParseResult.Invalid, null);
AssertDoubleTryParse("1EE-10", ParseResult.Invalid, null);
AssertDoubleTryParse("1E-1-0", ParseResult.Invalid, null);
AssertDoubleTryParse("1-E10", ParseResult.Invalid, null);
AssertDoubleTryParse("", ParseResult.Invalid, null);
AssertDoubleTryParse("5.1231231E", ParseResult.Invalid, null);
AssertDoubleTryParse("1E+23i", ParseResult.Invalid, null);
+17 -1
View File
@@ -973,7 +973,7 @@ namespace Newtonsoft.Json.Utilities
length--;
}
var i = start;
int i = start;
int end = start + length;
int numDecimalStart = end;
int numDecimalEnd = end;
@@ -985,6 +985,17 @@ namespace Newtonsoft.Json.Utilities
switch (chars[i])
{
case '.':
if (i == start)
{
return ParseResult.Invalid;
}
if (numDecimalStart != end)
{
// multiple decimal points
return ParseResult.Invalid;
}
numDecimalStart = i + 1;
break;
case 'e':
@@ -994,6 +1005,11 @@ namespace Newtonsoft.Json.Utilities
{
return ParseResult.Invalid;
}
if (i == numDecimalStart)
{
// E follows decimal point
return ParseResult.Invalid;
}
i++;
if (i == end)
{