首页 文章

C#:科学记数法字符串到Int64转换失败

提问于
浏览
3

我试图解析科学记数法中的数字时遇到异常 . 看看有关如何做到这一点的其他帖子,我不知道我做了什么不同于那些 .

我尝试过以下方法:

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);

这与我上一个例子类似,我只接受所有数字样式,而答案使用了负数指数 . 事实上,我将这个确切的字符串输入到我的示例中,但仍然会得到相同的例外情况 .

不确定它是否重要,但我使用的是Unity附带的Mono C#版本 .

这是C#源文件:https://github.com/Unity-Technologies/mono/blob/unity-staging/mcs/class/corlib/System/Int64.cs . 在第469行抛出异常,并且没有猜测在355或372行创建了异常,因为那些匹配异常类型和消息我正在显示 .

1 回答

  • 0

    我'm going to assume that this is a bug with the version of Mono C# I' m使用,它随Unity 5.5.x或更早版本一起提供 . 他们的存储库can be found here .

    Their implementation of Int64.Parse甚至不检查 NumberStyles.AllowExponents 标志,或以任何方式处理指数 . 所以当它在字符串中找到 + 符号时会失败 . 基本上, Int64.Parse 使用Unity时不支持exponents .

    Mono's Int32.Parse似乎确实在寻找指数,但仍然会导致我给它的所有指数的OverflowException .

    Decimal.Parse实际上使用与其他两个相同的参数,这表明字符串或参数没有任何问题,但它解析与Int解析的完成方式完全不同,这可以解释为什么它的工作原理和其他人没有 .

相关问题