【问题标题】:C#: Dealing with format exception for Convert.ToDouble('Infinity') on Windows 10C#:处理 Windows 10 上 Convert.ToDouble('Infinity') 的格式异常
【发布时间】:2016-05-12 07:25:02
【问题描述】:

我有一个 C# 表单应用程序。作为其功能的一部分,它以字符串格式将 double 值写入文件,其中一些是 double.Infinity。

应用程序的另一部分从文件中读取这些值并将它们转换回双精度值。

在 Windows 7 上执行写入值部分并在 Windows 10 上执行读取相同文件时,转换“无限”时会出现格式异常。似乎默认 (us-en) 文化使用的符号在 Windows 8 和 10 之间发生了变化。

应用程序中有很多 Convert.ToDouble() 实例,通过 try-catch 或使用 double.tryParse() 处理每个实例不是可行的解决方案,因为它需要在许多项目中进行更改。

是否有任何解决方法来避免这种格式异常问题?

提前致谢,

卡皮尔

【问题讨论】:

  • 嗯,这是一个定时炸弹。不是唯一的问题,例如,当您的程序移动到小数点用逗号写入的边界时,数据会变成乱码。如果您不想更改解析代码以使用带有 NumberFormat 参数的 Parse/TryParse 重载,就像您应该的那样,那么您必须使用您自己的文化更改 Thread.CurrentCulture 属性。使用使用您首选的 Negative/PositiveInfinitySymbol 值的自定义 NumberFormatInfo。
  • 谢谢汉斯。在初始化应用程序时自定义当前文化时,设置预期的无穷大常数;它已经奏效了。

标签: c# windows-10 cultureinfo


【解决方案1】:

在处理数据库和在其他文化中存储数据时,这也是一个更大的问题。我们最初遇到的问题是,我们软件的西班牙语版本无法正确读取无穷大,并且会将无穷大存储为符号,而不是单词。即使试图将它强加到英国文化中,它也显得很糟糕。

然后我们看到这个问题在英语文化中的 Windows 10 上突然出现,其中无穷大符号现在将保存在数据库中。此问题可能会导致跨 Windows 版本和跨文化的问题。 最安全的做法是使用 CultureInfo.InvariantCulture 存储和检索数据,无论是在文件还是数据库中。这样,它将始终如您所愿。

如果您已经在文件/数据库中遇到问题,那么您可以运行一个相当简单的脚本来查找“Double|∞”并将其替换为“Double|Infinity”,它是不变量类型。 这将使您免于未来的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多