[英]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);
这个答案暗示使用这个:
Double.Parse("1.234567E-06", System.Globalization.NumberStyles.Float);
这与我上一个例子类似,我只接受所有数字样式,而答案使用了负数指数。 事实上,我将这个确切的字符串输入到我的示例中,但我仍然得到相同的例外情况。
不确定它是否重要,但我使用的是Unity附带的Mono C#版本。
这是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或更早版本一起提供。 他们的存储库可以在这里找到 。
他们对Int64.Parse
的实现甚至不检查NumberStyles.AllowExponents
标志,或以任何方式处理指数。 所以当它在字符串中找到+
符号时会失败。 基本上,使用Unity时Int64.Parse
不支持exponents。
Mono的Int32.Parse
似乎确实在寻找指数,但仍然会导致我给它的所有指数的OverflowException。
Decimal.Parse
实际上使用与其他两个相同的参数,这表明字符串或参数没有任何问题,但它只是其他Parse方法中的一个错误。 Decimal的解析与Int解析的完成方式完全不同,因此可以解释为什么它可以正常工作而其他解析不工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.