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