2

该代码是在针对 .NET3.5 的 VS2008 中编译的。这在我的系统上无法重现。我怀疑某种本地化设置在起作用,但我对此知之甚少。

所有其他有效数字似乎都可以正常工作。此代码说明了该错误(导致相同的异常但不是生产代码):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "";
            do
            {
                str = Console.ReadLine();
                Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
            }
            while (str != null);
        }
    }
}

在命令行中,输入“0”会使应用程序在我遇到的至少一个系统上崩溃。

来自用户 PC 的堆栈跟踪:

System.FormatException: Input string was not in a correct format.
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
   at System.Double.Parse(String s, NumberStyles style, NumberFormatInfo info)
   at System.Convert.ToDouble(String value)
4

6 回答 6

5

如果您的问题与当前文化有关,请尝试使用 Invariant Culture 转换为 Double:

Convert.ToDouble("0", System.Globalization.CultureInfo.InvariantCulture);
于 2010-12-16T14:26:59.730 回答
5

我从不久前的一个问题中记住了这个问题。Parse() 方法受控制面板 + 区域和语言小程序中的用户覆盖的影响。IIRC,它对“负号符号”设置特别敏感。要求您的用户更正那里的设置。

参考问题在这里

于 2010-12-16T15:47:27.590 回答
1

很容易证明这不是因为代码(或 CultureInfo),我可以证明对于 .NET 中的所有文化,字符串“0”可以正确转换为 double。

string inputNumber = "0";
foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
   try
   {
       double d = Convert.ToDouble(inputNumber, culture);
   }
   catch
   {
      Console.WriteLine(culture.Name);
   }
}
Console.WriteLine("end");
Console.Read();

它只输出一个“结束”。

于 2010-12-16T14:52:01.397 回答
0

这可能与文化背景有关。据我所知,在某些文化设置中,您应该输入 0.0 才能转换为双精度

于 2010-12-16T14:27:31.070 回答
0

我认为输入时它不会崩溃0

当你输入任何不是数字的东西时,它当然会崩溃。这意味着如果您输入一个空字符串(换句话说,只需按回车键),它将崩溃。我想这就是你正在经历的。

如果您将其更改为以下代码,您的代码将起作用(仅适用于数字):

string str = "";
do
{
    str = Console.ReadLine();
    if(!string.IsNullOrEmpty(str))
        Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
}
while (str != "");
于 2010-12-16T14:27:39.797 回答
0

CurrentCulture CultureInfo 实例可能是罪魁祸首。毕竟,Convert.ToDouble调用只是返回Double.Parse的结果。正如所记录的,这使用当前文化的 NumberFormatInfo 来解决问题。

于 2010-12-16T14:28:09.370 回答