Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查double.Parse是否失败_C# - Fatal编程技术网

C# 检查double.Parse是否失败

C# 检查double.Parse是否失败,c#,C#,在为Autocad(绘图软件)编写插件时,我创建了一个3d点构建,它由3个表示3d点的X、Y和Z值的双值组成 Point3d insertPoint = new Point3d((insPointX = StrToDouble(tbInsPointX.Text)), insPointY = StrToDouble(tbInsPointY.Text), ins

在为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时让它停止不是一个选项,因为它实际上可以是一个实际值。

您可能正在寻找,这有一个额外的优点,即它不会引发异常

double output;
if (double.TryParse(input, out output))
{
    // Success
}
else
{
    // Failure
}
如果大家都在寻找类似的功能,那么.NET中几乎所有的“struct”类型(数字、日期时间、时间跨度等)都有一个
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
}

这就是例外的原因,如果你不能解决问题,就不要在此时抓住它。您可以在3dpoint创建中捕获异常并报告创建失败。另一点是,您应该尽可能捕获特定的异常类型,而不是常规的System.exception。在这种情况下,它将是ArgumentException或FormatException iguess@Dante1986:如果TryParse失败,请返回失败状态或自行引发异常。您可以返回
double.NaN
以指示
字符串
不代表数字。然后拒绝创建
Point3d
,如果任何参数是
double.NaN
。我明白了,所以基本上只使用TryParsePoint3d作为检查其是否有效的方法,如果为真,我将在那里进行真正的分析。谢谢你的邀请awnser@Dante1986-否,如果
TryParsePoint3d
返回true,则
insertPoint
已包含解析数据。无需再次解析。所有
TryParse
方法都应按如下方式工作:它们有一个或多个输入参数和一个所需类型的输出参数。该输出参数由标记。然后,该方法尝试解析输入参数并创建所需类型的对象。如果有效:将该对象指定给输出参数并返回
true
。如果不起作用:为输出参数指定一些伪值并返回
false
。因此,如果返回
true
,则可以确保输出参数包含正确的解析数据。