C# 格式异常未经处理#

C# 格式异常未经处理#,c#,C#,我正试图在桌面c#应用程序中保存一组记录,但由于其中一个值的格式不正确,该记录似乎停止了 保存前,系统将进行以下计算: private void ComputeTotalWeight() { double TotalWeight; TotalWeight = ((Convert.ToInt32(txtSmall.Text)) + (Convert.ToInt32(txtMedium.Text)) + (Convert.ToInt32(txtLarge.Te

我正试图在桌面c#应用程序中保存一组记录,但由于其中一个值的格式不正确,该记录似乎停止了

保存前,系统将进行以下计算:

private void ComputeTotalWeight()
    {
        double TotalWeight;
        TotalWeight = ((Convert.ToInt32(txtSmall.Text)) + (Convert.ToInt32(txtMedium.Text)) + (Convert.ToInt32(txtLarge.Text)) + 
            (Convert.ToInt32(txtExtralarge.Text))) * .285;
        txtTotalweight.Text = String.Format("{0:#,##0}", TotalWeight);

    }

    private void ComputeTagsCollars()
    {
        int TagsCollars;
        TagsCollars = Convert.ToInt32(txtSmall.Text) + Convert.ToInt32(txtMedium.Text) 
            + Convert.ToInt32(txtLarge.Text) + Convert.ToInt32(txtExtralarge.Text);
        txtTags.Text = String.Format("{0:#,##0}", TagsCollars);
        txtCollars.Text = String.Format("{0:#,##0}", TagsCollars);

    }
但一旦我保存了,它似乎在GrandTotal计算中遇到了问题:

我怀疑错误来自以下计算:

private void ComputeGrandTotal()
    {
        double GrandTotal;
        GrandTotal = (((Convert.ToInt32(txtSmall.Text) + Convert.ToInt32(txtMedium.Text) + Convert.ToInt32(txtLarge.Text) + 
            Convert.ToInt32(txtExtralarge.Text)) * .285) * 315);

        double TagsCollars;
        TagsCollars = Convert.ToInt32(txtSmall.Text) + Convert.ToInt32(txtMedium.Text) + Convert.ToInt32(txtLarge.Text) + Convert.ToInt32(txtExtralarge.Text);
        txtTags.Text = String.Format("{0:#,##0}", TagsCollars);
        txtCollars.Text = String.Format("{0:#,##0}", TagsCollars);

        lblGrandtotal.Text = String.Format("{0:#,###,##0}", (GrandTotal + TagsCollars + TagsCollars));

    }
我试着注释掉所有与GrandTotal相关的值和函数,记录开始保存,没有问题。这是我的保存功能的副本:

private void InsertNewRecord()
    {
        SqlCommand cmdInsert = new SqlCommand();
        cmdInsert.Connection = cn;
        cmdInsert.CommandType = CommandType.Text;
        //cmdInsert.CommandType = CommandType.StoredProcedure;

        cmdInsert.Parameters.AddWithValue("@QtySmall", Convert.ToInt32(txtSmall.Text));
        cmdInsert.Parameters.AddWithValue("@QtyMedium", Convert.ToInt32(txtMedium.Text));
        cmdInsert.Parameters.AddWithValue("@QtyLarge", Convert.ToInt32(txtLarge.Text));
        cmdInsert.Parameters.AddWithValue("@QtyExtralarge", Convert.ToInt32(txtExtralarge.Text));
        cmdInsert.Parameters.AddWithValue("@QtyTags", Convert.ToInt32(txtTags.Text));
        cmdInsert.Parameters.AddWithValue("@QtyCollars", Convert.ToInt32(txtCollars.Text));
        cmdInsert.Parameters.AddWithValue("@TotalWeight", Convert.ToInt32(txtTotalweight.Text));
        cmdInsert.Parameters.AddWithValue("@NoWorkers", Convert.ToInt32(txtWorkersno.Text));
        cmdInsert.Parameters.AddWithValue("@NoMachines", Convert.ToInt32(txtMachinesno.Text));
        cmdInsert.Parameters.AddWithValue("@BomStatus", SqlDbType.VarChar).Value = txtStatus.SelectedItem.ToString();
        cmdInsert.Parameters.AddWithValue("@StartDate", SqlDbType.DateTime).Value = dtpStart.Value;
        cmdInsert.Parameters.AddWithValue("@EndDate", SqlDbType.DateTime).Value = dtpEnd.Value;
        cmdInsert.Parameters.AddWithValue("@GrandTotal", Convert.ToInt32(lblGrandtotal.Text));
        cmdInsert.CommandText = " INSERT INTO BillOfMaterials2 " + " (QtySmall, QtyMedium, QtyLarge, QtyExtralarge, QtyTags, QtyCollars, TotalWeight, NoWorkers, NoMachines, BomStatus, StartDate, EndDate, GrandTotal) VALUES (" + "@QtySmall, @QtyMedium, @QtyLarge, @QtyExtralarge, @QtyTags, @QtyCollars, @TotalWeight, @NoWorkers, @NoMachines, @BomStatus, @StartDate, @EndDate, @GrandTotal)";
        //cmdInsert.CommandText = "spInsertBom";



        cmdInsert.ExecuteNonQuery();
    }

任何帮助都将不胜感激。

您正试图解析lblGrantotal.Text中的整数,但遇到FormatException,这意味着lblGrantotal中的文本无法识别为数字。可能您正在使用逗号而不是点作为十进制分隔符,或类似的东西。

1我不会尝试使用convert将textbox.text值转换为Int32;更好地使用

Int32 myint = 0;
Int32.TryParse(textbox.text, out myint) ;
这可以确保文本可以转换为整数,否则返回值为0

然后在save方法中,@GrandTotal参数试图保存到什么数据类型?-您的数据库中的类型是什么??它们匹配吗?如果不匹配,则会出现格式异常。您的数据(类型)与列类型的格式(类型)不同

op的文本框中没有有效数字,他有以下内容:

    lblGrandtotal.Text = String.Format("{0:#,###,##0}", 
(GrandTotal + TagsCollars + TagsCollars));

这就是他在代码中设置参数value=lblgrandtottal.Text的原因。它不是一个数字,它有格式逗号等。。他需要删除这些字符才能使其正常工作,使用Int.TryParse可以很容易地揭示这一点。

它从这里开始-首先,您要在格式字符串中添加带逗号的十进制字符

lblGrandtotal.Text = String.Format("**{0:#,###,##0}**", (GrandTotal + TagsCollars + TagsCollars));
另外,稍后在代码中存储INT数据库,而实际上它是十进制的。
正如ken所提到的,使用tryparse将值从字符串转换为…

这里有几个问题,其他一些帖子也提到了,但是,真正突出的是(在我看来)你没有验证输入数据,这有很多原因,这是有风险的,会引起未来的麻烦并导致这些问题。此外,您还可以使用标准的数字输入控件。但是,如果由于某种原因无法使用它们,则应该验证输入,如果数据无效,则应对其进行处理。下面是验证并处理无效输入的快速方法

private void ComputeGrandTotal()
{
    //Since there are values that need to be validated and converted to integers for use in two calculations...
    int smll, mdm, lg, xl;
    //Validate the inputs can be converted and set the appropriate variable values at the same time
    if (Int32.TryParse(txtSmall.Text, out smll) //using TryParse sets the integer variable values only if they can successfully be converted
        && Int32.TryParse(txtMedium.Text, out mdm)
        && Int32.TryParse(txtLarge.Text, out lg)
        && Int32.TryParse(txtExtralarge.Text, out xl)
        )
    {
        int ttl = smll + mdm + lg + xl;
        double GrandTotal, TagsCollars;
        TagsCollars = ttl;
        GrandTotal = TagsCollars * .285 * 315;

        txtTags.Text = $"{TagsCollars:#,##0}"; //Resharper suggested simplification of String.Format("{0:#,##0}", TagsCollars)....I believe ReSharper
        txtCollars.Text = $"{TagsCollars:#,##0}";
        lblGrandtotal.Text = $"{(GrandTotal + TagsCollars + TagsCollars):#,###,##0}";

    }

}
这将使工作完成,但它相当不灵活。每个输入必须成功转换为整数,否则将失败。更好、更耗时的方法如下:

    int smll;//, mdm, lg, xl;
    try
    {
        smll = Convert.ToInt32(txtSmall.Text);

    }
    catch (FormatException)
    {
        smll = 0;
        //txtSmall.Text value can't be converted to an integer
    }
    catch (Exception)
    {
        //some other issue occurred and you're probably better off just exiting entirely
        return;
    }

还有更灵活的方法,例如使用数字样式等等,但是,它们的灵活性是以您必须更清楚编码内容和方式的影响为代价的。有时,培训客户比编写您不自信的代码更安全。

请提供-请仔细阅读本指南,并确保文章中的样本最少(提出它也可能解决您的问题-不确定是否与您有关)。您的问题只存在于
Convert.ToInt32(lblgrandtall.Text)
,代码的其余部分不需要。您是否验证了在获取异常时此方法接收的字符串?调试和查找原因应该非常容易。@Andrew文章中还需要另一行代码,即创建值的代码。。(不知道OP为什么选择数字的自定义格式,但他们会支付无法解析的费用)。(扰流板-答案在-
int.parse(“1234”,NumberStyles.AllowThousands,CultureInfo.InvariantCulture)”中解释。
,您也应该首先使用特定于区域性的数字格式)@AlexeiLevenkov这是创建值的代码:lblGrandtotal.Text=String.Format(“{0:#,###,###,##0}”,(GrandTotal+TagsCollars+TagsCollars));如果你真的读过这个问题,你就会知道为什么代码会失败。。。建议泛型改进应该在注释中完成。@Alexei Levenkov它可能读起来像泛型改进-但是如果他使用TryParse,他的代码不会失败-它失败是因为字符串不能转换为整数。。在我的代码中,他会得到一个不同于他所想的值,并且可以调试以查看他试图转换的值。对于某些人来说,找到计算问题比找到编程调试消息更容易。这也没有任何用处(大多数人称之为“不工作”)-显然OP在那里需要有效的数字(这是很好的理由,因为他们在该字段中输入数字,格式也很奇怪)@Ken将其保存到我数据库中的int数据类型谢谢!我将对此进行研究:)顺便说一句,visual studio不会接受您提供的一些代码:txtTags.Text=$“{TagsCollars:#,##0}”//Resharper建议简化String.Format(“{0:#,##,0}”,TagsCollars)…我相信Resharper txtclars.Text=$”{TagsCollars:#,##,0}”;lblGrandtotal.Text=$“{(GrandTotal+TagsCollars+TagsCollars):#,###,##0}”;它们在$forwards的开头有红色下划线,
$
是C#6的一个新特性。用
string.Format
替换这些。