使用 double.Parse 处理空值

4
以下是我的声明:
double? My_Value = null;
   if (Request.Form["MyValue"] != null)
    My_Value = double.Parse(Request.Form["MyValue"].ToString());

当我尝试提交表单时,如果'MyValue'没有值,我会收到一个运行时错误,提示“输入字符串的格式不正确”。当我尝试使用以下代码时:

 My_Value = double.TryParse(Request.Form["MyValue"].ToString());

当我在Visual Studio中使用'TryParse'方法时,出现了编译错误,提示说“没有接受1个参数的'TryParse'方法重载”。

当我为'My_Value'提供一个值时,表单会提交成功。如何让程序接受空值?谢谢。


2
你会在这里得到答案,但请将其视为学习语言规则和调试的起点。这是一个基本问题,你必须立即自己解决这样的问题并发展解决问题的技能。 - usr
作为一个可能刚开始或者因为脑抽而卡住的人,建议你进行更好的谷歌搜索或自学等并不是很有帮助。在我看来,有时候你只需要一个快速的答案,如果通过谷歌或者Stack Overflow找到了这里,下面的讨论和回答比MSDN文档更加清晰明了。有时候我们会切换语言,但是就是想不起来在C#中该怎么做,因此才会在Stack Overflow上提问并得到答案。 - ransems
4个回答

4

您需要声明一个双精度变量来存储result并将其作为输出参数传递给TryParse,如果解析成功,它将被分配:

double result;

var isValid = double.TryParse(Request.Form["MyValue"].ToString(), out result);

另外,TryParse 方法与 Parse 方法不同,它不返回数值结果,而是返回一个布尔值结果,指示解析是否成功。因此您需要分配该结果并检查其值以确保解析成功。或者,您可以直接检查结果,而无需将其存储在变量中。

double result;
double? My_Value = double.TryParse(Request.Form["MyValue"].ToString(), out result)
            ? (double?)result
            : null;

2

两种解决方案都会导致结果为0;

string myString = null;
double result = Convert.ToDouble(myString);

或者

string myString = null;
double result = double.Parse(myString ?? "0");

0

TryParse 的签名是 bool TryParse(string str, out double result)

使用方法如下:

double result;
var success = double.TryParse(Request.Form["MyValue"].ToString(), out result);

My_Value = success? result : 0d;

正如“usr”在评论中提到的,下次遇到这样的错误,您应该先查看MSDN文档再来这里。


0
你的第一种情况的问题不仅在于处理null,而是要处理任何无法解析的东西(因为你正在接受来自不可信来源的值)。在这里使用TryParse方法是正确的做法。
然而,TryParse方法接受两个参数,第一个是要解析的值,第二个是在解析成功时要分配的值(作为输出参数)。
对于正好需要可空结果的情况,自定义实用方法会很方便:
public static class NullableDouble
{
  public static double? TryParse(string input)
  {
    double result;
    var success = double.TryParse(input, out result);
    return success ? result as double? : null;
  }
}

可以这样使用:

var myValue = NullableDouble.TryParse((Request.Form["MyValue"] ?? string.Empty).ToString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接