9

我正在尝试将此字符串转换为双精度

Convert.ToDouble("1.12");

这是输出

System.FormatException 未处理。

我应该做这样的事情吗?

    public static double ConvertToDouble(string ParseVersion)
    {
        double NewestVersion;
        try
        {
            NewestVersion = Convert.ToDouble(ParseVersion);
        }
        catch
        {
            ParseVersion = ParseVersion.Replace('.', ',');
            NewestVersion = Convert.ToDouble(ParseVersion);
        }

        return NewestVersion;
    }

    ConvertToDouble("1.12");

还是有更简单的解决方案?

4

4 回答 4

30

double.Parse默认情况下将使用当前的文化。听起来你想要不变的文化:

double d = double.Parse("1.12", CultureInfo.InvariantCulture);

编辑:为了清楚起见,如果您尝试解析用户在不同文化中输入的文本,显然您不应该使用它。当您接收到不变文化的数据(大多数基于机器对机器数据的基于文本的格式)并希望在解析时强制执行该数据时,可以使用此选项。

于 2011-07-23T12:49:12.823 回答
3

您不必替换.,.. 但是更好的方法是使用 .netTryParse方法,例如:

double d;
if (double.TryParse("your string data", out d)
{
    Console.WriteLine(d);
}

编辑:另请注意,通过替换.,会得到错误的结果,例如1.12

double d = double.Parse(1.12);//d will equals to 1.12
double d = double.Parse(1,12);//d will equals to 112.0
于 2011-07-23T12:45:56.790 回答
2

Convert.ToDouble 在内部使用 Double.Parse。如果您不确定文化背景,您应该使用重载 Double.Parse 来精确文化:

double d = double.Parse("1.12", CultureInfo.InvariantCulture);
于 2011-07-23T12:49:46.380 回答
0

请记住,此问题可能取决于输入字符串的来源。如果它作为对象从数据库中读取,您可以通过将其保留为对象并使用 Convert.ToDouble() 来解决您的问题,如下所示:

public double Double_fromObject(object obj)
    {
      double dNum = 0.0;
      if (obj.ToString() != string.Empty) // the Convert fails when ""
      {
        try
        {
          dNum = Convert.ToDouble(obj);
        }
        catch (SystemException sex)
        {
          // this class's error string
          LastError = sex.Message;
        }
      }

      return (dNum);
    }
于 2014-08-12T15:48:15.047 回答