空字符串使用(尝试)解析使用

时间:2012-12-19 13:26:51

标签: c# parsing double tryparse

我在这里使用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);
    

7 个答案:

答案 0 :(得分:8)

如果无法解析字符串并且Parse返回TryParse,则

bool会抛出异常。您可以处理此bool(如果解析成功,则为true,否则为false)以显示您要显示的成功/错误消息。

由于myValueout参数,因此必须由方法设置,因此,如果无法解析字符串,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的全部意义,它永远不会引发异常......