【问题标题】:C#: Scientific notation String to Int64 conversion failingC#:科学记数法字符串到 Int64 转换失败
【发布时间】:2016-07-22 19:37:36
【问题描述】:

我在尝试解析科学计数法的数字时遇到异常。看看其他关于如何做到这一点的帖子,我不知道我在做什么与那些有什么不同。

我尝试了以下方法:

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: Value was too large or too small.

还尝试使用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 行创建的,因为它们与我正在显示的异常类型和消息相匹配。

【问题讨论】:

  • 当我在 dotnet fiddle 中运行它时,这是有效的,请参阅 dotnetfiddle.net/lHWbgM
  • 当我在 dotnet fiddle 中运行它时,这不起作用:dotnetfiddle.net/PvGfoW 编辑:两个示例之一确实有效。
  • 表示有数字样式的重载,第一个不行
  • Int64.Parse 适用于 dotnetfiddle,但不适用于我的项目 (Mono C#)。
  • 99% 你住在错误的地方:) 解析非区域设置特定数值时使用CultureInfo.InvariantCulture

标签: c# parsing unity3d mono


【解决方案1】:

我将假设这是我正在使用的 Mono C# 版本的错误,它随 Unity 5.5.x 或更早版本提供。他们的仓库can be found here

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

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

Decimal.Parse 实际上确实使用与其他两个相同的参数,这表明字符串或参数没有任何问题,但这只是他们其他 Parse 方法中的一个错误。 Decimal 的解析与 Int 解析的方式完全不同,因此这可以解释为什么它有效而其他无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-22
    • 2015-12-26
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多