我在这里使用Parse进行转换值(现在是3.5)。
string myString = String.Empty;
double myValue = double.Parse(myString);
抛出FormatException(我期望0.0)。
如果我使用2.0 +重写它
string myString = String.Empty;
double myValue;
if (double.TryParse(myString, out myValue))
//do something
我得到了想要的0.0,但不幸的是我失去了获得有意义的错误消息的可能性(在else树中)。
为什么给我解析错误和TryParse我的期望值? 有没有办法从TryParse中获取错误消息(时间不是问题)?
我不想那样解决它:
使用if ... then
避免错误myValue = myString.Length == 0 ? 0.0 : double.Parse(myString);
如果发生错误,则发出两次电话
if (!double.TryParse(myString, out myValue))
myValue = double.Parse(myString);
答案 0 :(得分:8)
Parse
返回TryParse
,则 bool
会抛出异常。您可以处理此bool(如果解析成功,则为true,否则为false)以显示您要显示的成功/错误消息。
由于myValue
是out
参数,因此必须由方法设置,因此,如果无法解析字符串,TryParse会将其设置为0.0,这就是为什么在使用时获取该数字的原因TryParse方法。
答案 1 :(得分:2)
不,无法获得确切的错误消息。您只想知道 if 是否可以转换为double和结果(如果可能)。转换失败的确切原因对您来说是隐藏的。
答案 2 :(得分:2)
TryParse允许您在不抛出异常的情况下进行转换,如果成功则返回true。你采取的行动取决于你
if (!double.TryParse(myString, out myValue))
{
//throw exception here
}
如果您不确定输入是否始终为数字
,则非常有用答案 3 :(得分:1)
为什么给我解析错误和TryParse我的期望值?
因为这是界面设计的方式。如果输入格式无效,TryParse
不会抛出异常。而是返回false
。
有没有办法从TryParse中获取错误消息(时间不是问题)?
不,但您可以自己制作错误消息。
if (double.TryParse(myString, out myValue))
{
//do something
}
else
{
throw new FooException("Problem!");
}
但是如果你想在出现错误时抛出异常,那么使用Parse
会更简单。
答案 4 :(得分:0)
TryParse
以某种方式实现:
try
{
Parse(...);
return true;
}
catch
{
return false;
}
所以你可以用同样的方式做到:
try
{
double.Parse(str, out dbl);
}
catch (Exception ex)
{
// Do something with ex.Message
dbl = 0.0;
}
// Continue with dbl.
答案 5 :(得分:0)
忘记double.TryParse
,因为它不会告诉你(按设计)为什么解析失败。做旧方式:
string myString = String.Empty;
double myValue = 0.0;
try
{
myValue = double.Parse(myString);
}
catch (FormatException)
{
// Now you have a meaningful story here!
}
答案 6 :(得分:0)
必须设置Out参数,因此如果TryParse失败,它会在输出返回之前将输出初始化为默认值,但是你会在“else”循环中...意思是失败...
尝试运行下面的代码,这将显示TryParse实际上覆盖了该值,但表明该解析失败了......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ParseAndOutput("");
ParseAndOutput("1.0");
ParseAndOutput("ABC");
}
private static void ParseAndOutput(string input)
{
double value = -1;
if (double.TryParse(input, out value))
{
Console.WriteLine("Parse succeeded for '"+input+"', try parse changed to: " + value);
}
else
{
Console.WriteLine("Parse failed for '" + input + "', try parse changed to: " + value);
}
}
}
}
因此Parse和TryParse在string.Empty上都失败了,他们只是报告失败的方式不同,这是TryParse的全部意义,它永远不会引发异常......