c#检查double.Parse是否失败

时间:2015-02-03 10:40:01

标签: c#

在为Autocad(绘图软件)编写插件时,我创建了一个3d点构建,其中包含3个双精度值,表示3d中某个点的X,Y和Z值。

Point3d insertPoint = new Point3d((insPointX = StrToDouble(tbInsPointX.Text)),
                                   insPointY = StrToDouble(tbInsPointY.Text),
                                   insPointZ = StrToDouble(tbInsPointZ.Text));

并且StrToDouble看起来像这样:

public double StrToDouble(string str)
    {
        double x = 0;
        try
        {
            x = double.Parse(str.Replace(",", "."));
        }
        catch (System.Exception ex) { MessageBox.Show(ex.Message); }

        return x;
    }

但是现在它实际上总是返回一个double,因为当解析失败时它将double返回为0。 我现在想知道什么是报告3dpoint创建的正确方法,即存在错误并且不应再继续。 我可以考虑使用bool或其他东西,但我认为这可能不是一个很好的干净方式。由于我只是一个业余爱好程序员,我不知道这是正确的方法。 当double = 0不是一个选项时让它停止,因为它实际上可以是一个实际值。

1 个答案:

答案 0 :(得分:6)

你可能正在寻找double.TryParse,它的另一个好处是它不会抛出异常。

double output;
if (double.TryParse(input, out output))
{
    // Success
}
else
{
    // Failure
}

.NET中的所有'struct'类型(数字,DateTime,TimeSpan等)都有一个TryParse方法,如果你们每个人都在寻找类似的功能。

要回答您的跟进,您可以将Point3d的解析包装成类似的TryParse方法:

private static bool TryParsePoint3d(string x, string y, string z, out Point3d output)
{
    double xValue, yValue, zValue;

    if (double.TryParse(x, out xValue) &&
        double.TryParse(y, out yValue) &&
        double.TryParse(z, out zValue))
    {
        output = new Point3d(xValue, yValue, zValue);
        return true;
    }

    // out params must be assigned, use null if it's a class
    output = new Point3d();
    return false;
}

您可以将其用作

Point3d insertPoint;

if (TryParsePoint3d(tbInsPointX.Text, tbInsPointY.Text, tbInsPointZ.Text, 
    out insertPoint))
{
    insertPoint is safe to use
}