C#:科学记数法字符串到 Int64 的转换失败
C#: Scientific notation String to Int64 conversion failing
我在尝试解析以科学记数法表示的数字时出现异常。查看其他关于如何做的帖子,我无法说出我在做什么与那些不同。
我试过以下方法:
System.Convert.ToInt64("1.0206e+06");
System.Convert.ToInt64("1.0206E+06"); // Uppercase 'E'
这些导致 FormatException:输入字符串的格式不正确。
我试过这些:
Int64.Parse("1.0206e+06", System.Globalization.NumberStyles.Any);
Int64.Parse("1.0206e+06", System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
Int64.Parse("1.0206e+06", System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture);
这些都会导致 OverflowException:值太大或太小。
也尝试使用 Int32.Parse
并得到相同的异常和消息:
(long)Int32.Parse(str, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
使用 Decimal.Parse
使用相同的字符串和传递给它的参数:
(long)Decimal.Parse(str, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
This answer 建议使用这个:
Double.Parse("1.234567E-06", System.Globalization.NumberStyles.Float);
这与我上一个例子类似,我只接受所有数字样式,并且该答案使用负指数。事实上,我将那个确切的字符串输入到我的示例中,但我仍然得到相同的异常。
不确定这是否重要,但我使用的是 Mono C#,Unity 附带的版本。
这是 C# 源文件:https://github.com/Unity-Technologies/mono/blob/unity-staging/mcs/class/corlib/System/Int64.cs。异常在第 469 行抛出,并且在那之前没有为我提供调用堆栈。但我猜异常是在第 355 行或第 372 行创建的,因为它们与我正在显示的异常类型和消息相匹配。
我假设这是我正在使用的 Mono C# 版本的错误,Unity 5.5.x 或更早版本随附该版本。他们的存储库 can be found here.
Their implementation of Int64.Parse
甚至不检查 NumberStyles.AllowExponents
标志,或以任何方式处理指数。所以当它在字符串中找到 +
符号时它会失败。基本上,使用Unity时Int64.Parse
不支持指数。
Mono's Int32.Parse
似乎在寻找指数,但仍然会导致 OverflowException 我给它的所有指数。
Decimal.Parse
实际上确实使用与其他两个相同的参数,这表明字符串或参数没有任何问题,但这只是其他 Parse 方法中的错误。 Decimal 的解析与 Int 解析的方式完全不同,所以这可以解释为什么它有效而其他的无效。
我在尝试解析以科学记数法表示的数字时出现异常。查看其他关于如何做的帖子,我无法说出我在做什么与那些不同。
我试过以下方法:
System.Convert.ToInt64("1.0206e+06");
System.Convert.ToInt64("1.0206E+06"); // Uppercase 'E'
这些导致 FormatException:输入字符串的格式不正确。
我试过这些:
Int64.Parse("1.0206e+06", System.Globalization.NumberStyles.Any);
Int64.Parse("1.0206e+06", System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
Int64.Parse("1.0206e+06", System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture);
这些都会导致 OverflowException:值太大或太小。
也尝试使用 Int32.Parse
并得到相同的异常和消息:
(long)Int32.Parse(str, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
使用 Decimal.Parse
使用相同的字符串和传递给它的参数:
(long)Decimal.Parse(str, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
This answer 建议使用这个:
Double.Parse("1.234567E-06", System.Globalization.NumberStyles.Float);
这与我上一个例子类似,我只接受所有数字样式,并且该答案使用负指数。事实上,我将那个确切的字符串输入到我的示例中,但我仍然得到相同的异常。
不确定这是否重要,但我使用的是 Mono C#,Unity 附带的版本。
这是 C# 源文件:https://github.com/Unity-Technologies/mono/blob/unity-staging/mcs/class/corlib/System/Int64.cs。异常在第 469 行抛出,并且在那之前没有为我提供调用堆栈。但我猜异常是在第 355 行或第 372 行创建的,因为它们与我正在显示的异常类型和消息相匹配。
我假设这是我正在使用的 Mono C# 版本的错误,Unity 5.5.x 或更早版本随附该版本。他们的存储库 can be found here.
Their implementation of Int64.Parse
甚至不检查 NumberStyles.AllowExponents
标志,或以任何方式处理指数。所以当它在字符串中找到 +
符号时它会失败。基本上,使用Unity时Int64.Parse
不支持指数。
Mono's Int32.Parse
似乎在寻找指数,但仍然会导致 OverflowException 我给它的所有指数。
Decimal.Parse
实际上确实使用与其他两个相同的参数,这表明字符串或参数没有任何问题,但这只是其他 Parse 方法中的错误。 Decimal 的解析与 Int 解析的方式完全不同,所以这可以解释为什么它有效而其他的无效。