如何将null转为0

时间:2010-07-12 06:04:44

标签: c# .net

我建立了一个小程序来计算15个或更少的平均数。有15个文本框,每个文本框的默认值为“0”。程序知道获取所有类型数字的总和,并将其除以不返回“0”的文本框的数量。但是如果用户错误地删除了其中一个文本框中的'0'之一..运行时错误。

最初我通过写“ if statement ”15次(每个文本框一个)来解决这个问题:

 if (t1.Text == "") { tr1 = 0; }
 else
 {
     tr1 = Double.Parse(t1.Text);
 }

此代码检查文本框中是否有东西(例如,名为t1),如果为true,则程序给出 double 'tr1'(不要与'混淆' t1'),值为'0',如果为false,则代码为 double 'tr1'提供't1'的文本。

我必须写'如果'15次。我想知道我是否可以用数组和for循环编写相同的代码,以及如何编写?

这里是整个代码(抱歉var名称与var的使用不相似。):

 private void goyouidiot_Click(object sender, EventArgs e)
 {
     double tr1;
     double tr2;
     double tr3;
     double tr4;
     double tr5;
     double tr6;
     double tr7;
     double tr8;
     double tr9;
     double tr10;
     double tr11;
     double tr12;
     double tr13;
     double tr14;
     double tr15;
     if (t1.Text == "") { tr1 = 0; }
     else
     {
         tr1 = Double.Parse(t1.Text);
     }
     if (t2.Text == "") { tr2 = 0; }
     else
     {
         tr2 = Double.Parse(t2.Text);
     }

     if (t3.Text == "") { tr3 = 0; }
     else
     {
         tr3 = Double.Parse(t3.Text);
     }


     if (t4.Text == "") { tr4 = 0; }
     else
     {
         tr4 = Double.Parse(t4.Text);
     }


     if (t5.Text == "") { tr5 = 0; }
     else
     {
         tr5 = Double.Parse(t5.Text);
     }

     if (t6.Text == "") { tr6 = 0; }
     else
     {
         tr6 = Double.Parse(t6.Text);
     }


     if (t7.Text == "") { tr7 = 0; }
     else
     {
         tr7 = Double.Parse(t7.Text);
     }


     if (t8.Text == "") { tr8 = 0; }
     else
     {
         tr8 = Double.Parse(t8.Text);
     }

     if (t9.Text == "") { tr9 = 0; }
     else
     {
         tr9 = Double.Parse(t9.Text);
     }


     if (t10.Text == "") { tr10 = 0; }
     else
     {
         tr10 = Double.Parse(t10.Text);
     }


     if (t11.Text == "") { tr11 = 0; }
     else
     {
         tr11 = Double.Parse(t11.Text);
     }


     if (t12.Text == "") { tr12 = 0; }
     else
     {
         tr12 = Double.Parse(t12.Text);
     }

     if (t13.Text == "") { tr13 = 0; }
     else
     {
         tr13 = Double.Parse(t13.Text);
     }


     if (t14.Text == "") { tr14 = 0; }
     else
     {
         tr14 = Double.Parse(t14.Text);
     }


     if (t15.Text == "") { tr15 = 0; }
     else
     {
         tr15 = Double.Parse(t15.Text);
     }
     double[] sch = { tr1, tr2, tr3, tr4, tr5, tr6, tr7, tr8, tr9, tr10, tr11, tr12, tr13, tr14, tr15 };
     double total = 0;
     double sorf = 0;
     for (int i = 0; i != 14; i++)
     {

         sorf = sorf + sch[i];

         if (sch[i] > 0)
         { total++; }

     }

     double totalic = sorf / total;
     string glass = totalic.ToString();
     result.Text = ("your score: " + glass);
}

7 个答案:

答案 0 :(得分:10)

Double.TryParse(t1.Text.Trim(), out tr1);

将tr1设置为文本框的数值,如果因某种原因无法转换,则为0.0。如果转换成功,它也会返回true,如果失败则返回false,但如果默认值为0.0,则不关心返回值。

已添加奖励:如果有人决定将“这不是数字”,则不会引发异常。进入文本框。它只会将值视为0。

要在数组中执行此操作...

TextBox t[] = { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 };
double tr[] = new double[t.Length];

for (int i = 0; i < t.Length; ++i)
{
    Double.TryParse(t[i].Text.Trim(), out tr[i]);
}

更新:

注意,期望能够计算包含0的数字的平均值是完全合理的。为此:

TextBox t[] = { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 };
double tr[] = new double[t.Length];
int valid_count = 0;

for (int i = 0; i < t.Length; ++i)
{
    if (Double.TryParse(t[i].Text.Trim(), out tr[i])) ++valid_count;
}

将TextBoxes的默认值设置为空白(“”),然后您将知道用户输入的合法数量为0,以及有多少空白。将总和除以valid_count以获得准确的平均值。 (但请确保valid_count > 0,否则您可能会获得除零例外。)

答案 1 :(得分:7)

当然,制作一个double tr[15]和相应的文本字段数组。

然后使用:

for (int i = 0; i < 15; i++) {
    if (t[i].Text == "") { 
        tr[i] = 0;
    } else {
        tr[i] = Double.Parse(t[i].Text);
    }
}

答案 2 :(得分:3)

如果只是使用if语句占用的大量源代码,您可以选择以下内容:

tr1  = ( t1.Text == "") ? 0 : Double.Parse( t1.Text);
tr2  = ( t2.Text == "") ? 0 : Double.Parse( t2.Text);
:
tr15 = (t15.Text == "") ? 0 : Double.Parse(t15.Text);

这很好,很整洁,不会占用大量的屏幕空间,而且很容易看到它的意图。

或者,更好的是,像:

tr1  = 0; try { tr1  = Double.Parse( t1.Text); } catch (Exception e) {};
tr2  = 0; try { tr2  = Double.Parse( t2.Text); } catch (Exception e) {};
:
tr15 = 0; try { tr15 = Double.Parse(t15.Text); } catch (Exception e) {};

因为字段可能无效非空白。

如果您对数据和控件的结构不同,可以对数组和for循环执行相同的操作,但对于只有15个项目可能不需要。当然,如果你要添加更多,我会认真考虑这个选项。

您可能希望将值直接加载到数组中,这样就不需要sch

double tr[15];
:
tr[ 0] = 0; try { tr[ 0] = Double.Parse( t1.Text); } catch (Exception e) {};
tr[ 1] = 0; try { tr[ 1] = Double.Parse( t2.Text); } catch (Exception e) {};
:
tr[14] = 0; try { tr[14] = Double.Parse(t15.Text); } catch (Exception e) {};
:
double total = 0;
double sorf = 0;
for (int i = 0; i < 15; i++) {
    if (tr[i] > 0) {
        sorf = sorf + tr[i];
        total++;
    }
}
:

对于 minimal 代码解决方案,您还可以创建一个从中提取信息的文本框数组。像(未经测试)的东西:

TextBox t[] = {t1, t2, t3, ..., t15};
double tr[t.length];
:
for (int i = 0; i < t.length; i++) {
    tr[i] = 0; try { tr[i] = Double.Parse(t[i].Text); } catch (Exception e) {};
}
:
double total = 0;
double sorf = 0;
for (int i = 0; i < tr.length; i++) {
    if (tr[i] > 0) {
        sorf = sorf + tr[i];
        total++;
    }
}
:

答案 3 :(得分:2)

编写一个将文本框值转换为double的函数,如:

private static double ConvertTextboxValueToDouble(string value)
{
    double result;
    Double.TryParse(value, out result);

    return result;
}

然后从文本框中创建一个数组,将它们的值转换为双精度数:

double[] values = 
    {
        ConvertTextboxValueToDouble(t1.text),
        ConvertTextboxValueToDouble(t2.text),
        ConvertTextboxValueToDouble(t3.text),
...
        ConvertTextboxValueToDouble(t15.text)
    }

答案 4 :(得分:1)

您是否考虑使用NumericUpDown而不是TextBox?

此外,您应该重新编写代码并尝试以下方法之一,而不是写一些东西十五次:

  • 为所有输入框注册一个事件,其中所有事件都使用相同的代码

    public void ValueChanged(Object sender, EventArgs e)
    {
        var numericUpDown = sender as NumericUpDown;
        if(numericUpDown  == null)
            return;
        //ToDo: Put some check code here
    }
    
  • 使用一些List<T>放置所有框,并迭代它以检查所有设置

    var myList = new List<NumericUpDown>();
    //ToDo: Put all your boxes into it
    myList.Add(numericUpDown1);
    myList.Add(numericUpDown2);
    //or get the list from somewhere else
    myList.AddRange(this.Controls.OfType<NumericUpDown>())
    
    //OnButtonClick
    foreach(var numericUpDown in myList)
    {
        //ToDo: Do some checking
    }
    

答案 5 :(得分:0)

从TextBox

中检索值时放置.Trim()

tr3 = Double.Parse(t3.Text.Trim());

答案 6 :(得分:0)

对于这种情况并考虑在一小部分代码中完成工作,我使用一个肮脏的小技巧:将控件放入面板。

如果您的面板仅包含所需的控件(在本例中为文本框),则这足以将值存储在双打列表中:

    private void button1_Click(object sender, EventArgs e)
    {
        List<double> doubleList = new List<double>();

        foreach (TextBox t in panel1.Controls)
            doubleList.Add(this.checkTextBox(t));
    }

    private double checkTextBox(TextBox t)
    {
        return (t.Text != string.Empty) ? Double.Parse(t.Text.Trim()) : 0;
    }

如果您不能只为文本框设置面板,并且设计强制您将控件混合到一起,则必须进行额外的检查/转换:

    private void button1_Click(object sender, EventArgs e)
    {
        List<double> doubleList = new List<double>();

        foreach (Control t in panel1.Controls)
            if(t is TextBox)
                doubleList.Add(this.checkTextBox((TextBox)t));
    }

    private double checkTextBox(TextBox t)
    {
        return (t.Text != string.Empty) ? Double.Parse(t.Text.Trim()) : 0;
    }

问候!