C# 检查double.Parse是否失败
在为Autocad(绘图软件)编写插件时,我创建了一个3d点构建,它由3个表示3d点的X、Y和Z值的双值组成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
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
,则可以确保输出参数包含正确的解析数据。