-Fix reading hexadecimal numbers that contain an e

This commit is contained in:
JamesNK
2010-07-16 07:29:40 +00:00
parent 08b8477f5e
commit 55adae5525
2 changed files with 27 additions and 8 deletions
@@ -671,5 +671,26 @@ bye", reader.Value);
Assert.IsFalse(reader.Read());
}
[Test]
public void ReadHexidecimalWithAllLetters()
{
string json = @"{""text"":0xabcdef12345}";
JsonTextReader reader = new JsonTextReader(new StringReader(json));
Assert.IsTrue(reader.Read());
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
Assert.IsTrue(reader.Read());
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
Assert.IsTrue(reader.Read());
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
Assert.AreEqual(11806310474565, reader.Value);
Assert.IsTrue(reader.Read());
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
}
}
}
+6 -8
View File
@@ -671,7 +671,6 @@ namespace Newtonsoft.Json
private void ParseNumber(char firstChar)
{
char currentChar = firstChar;
bool nonBase10 = (firstChar == '0');
// parse until seperator character or end
bool end = false;
@@ -693,18 +692,17 @@ namespace Newtonsoft.Json
object numberValue;
JsonToken numberType;
if (number.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1
|| number.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1)
{
numberValue = Convert.ToDouble(number, CultureInfo.InvariantCulture);
numberType = JsonToken.Float;
}
else if (nonBase10)
if (firstChar == '0' && !number.StartsWith("0.", StringComparison.OrdinalIgnoreCase))
{
numberValue = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase)
? Convert.ToInt64(number, 16)
: Convert.ToInt64(number, 8);
numberType = JsonToken.Integer;
}
else if (number.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || number.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1)
{
numberValue = Convert.ToDouble(number, CultureInfo.InvariantCulture);
numberType = JsonToken.Float;
}
else
{