inputstring的格式不正确

我是新来的C#,我有一些Java的基本知识,但我不能让这个代码正常运行。

这只是一个基本的计算器,但是当我运行该程序VS2008给我这个错误:

计算器

我做了几乎相同的程序,但使用JSwing的Java,它完美的工作。

这里是c#的forms:

形成

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace calculadorac { public partial class Form1 : Form { int a, b, c; String resultado; public Form1() { InitializeComponent(); a = Int32.Parse(textBox1.Text); b = Int32.Parse(textBox2.Text); } private void button1_Click(object sender, EventArgs e) { add(); result(); } private void button2_Click(object sender, EventArgs e) { substract(); result(); } private void button3_Click(object sender, EventArgs e) { clear(); } private void add() { c = a + b; resultado = Convert.ToString(c); } private void substract() { c = a - b; resultado = Convert.ToString(c); } private void result() { label1.Text = resultado; } private void clear() { label1.Text = ""; textBox1.Text = ""; textBox2.Text = ""; } } 

可能是什么问题? 有没有办法解决它?

PS:我也试过

 a = Convert.ToInt32(textBox1.text); b = Convert.ToInt32(textBox2.text); 

并没有工作。

这个错误意味着你试图parsing一个整数的string实际上并不包含一个有效的整数。

当表单被创build时,文本框将不可能立即包含一个有效的整数 – 这是获取整数值的地方。 更新button点击事件中的ab会更有意义(就像你在构造函数中一样)。 此外,请查看Int.TryParse方法 – 如果string实际上不包含整数,它会更容易使用 – 它不会抛出exception,因此更容易从中恢复。

我遇到了这个确切的例外,除了它与parsing数字input无关。 所以这不是OP问题的答案,但我认为分享知识是可以接受的。

我声明了一个string,并将其格式化为需要大括号({})的JQTree 。 你必须使用双花括号来接受它作为格式正确的string:

 string measurements = string.empty; measurements += string.Format(@" {{label: 'Measurement Name: {0}', children: [ {{label: 'Measured Value: {1}'}}, {{label: 'Min: {2}'}}, {{label: 'Max: {3}'}}, {{label: 'Measured String: {4}'}}, {{label: 'Expected String: {5}'}}, ] }},", drv["MeasurementName"] == null ? "NULL" : drv["MeasurementName"], drv["MeasuredValue"] == null ? "NULL" : drv["MeasuredValue"], drv["Min"] == null ? "NULL" : drv["Min"], drv["Max"] == null ? "NULL" : drv["Max"], drv["MeasuredString"] == null ? "NULL" : drv["MeasuredString"], drv["ExpectedString"] == null ? "NULL" : drv["ExpectedString"]); 

希望这会帮助其他人发现这个问题,但不parsing数字数据。

如果您没有对文本字段中的数字进行明确的validation,则无论如何,最好使用它

 int result=0; if(int.TryParse(textBox1.Text,out result)) 

现在,如果结果是成功的,那么你可以继续进行计算。

你还没有提到如果你的文本框有devise时间或现在的价值。 当表单devise时,如果表单初始化的文本框没有放在文本框中,可能就不值了。 你可以在表单devise中通过设置文本属性的int值,这应该工作。

问题

有一些可能的情况,为什么发生错误:

  1. 因为textBox1.Text只包含数字,但数字太大/太小

  2. 由于textBox1.Text包含:

    • a)非数字(开始/结束时的space-开头的space除外)和/或
    • b)在您的代码的应用文化中的千分隔符,而不指定NumberStyles.AllowThousands或者指定NumberStyles.AllowThousands但在文化中放入错误的thousand separator和/或
    • c)小数分隔符(不应该存在于intparsing中)

不正确例如:

情况1

 a = Int32.Parse("5000000000"); //5 billions, too large b = Int32.Parse("-5000000000"); //-5 billions, too small //The limit for int (32-bit integer) is only from -2,147,483,648 to 2,147,483,647 

案例2 a)

 a = Int32.Parse("a189"); //having aa = Int32.Parse("1-89"); //having - but not in the beginning a = Int32.Parse("18 9"); //having space, but not in the beginning or end 

案例2 b)

 NumberStyles styles = NumberStyles.AllowThousands; a = Int32.Parse("1,189"); //not OK, no NumberStyles.AllowThousands b = Int32.Parse("1,189", styles, new CultureInfo("fr-FR")); //not OK, having NumberStyles.AllowThousands but the culture specified use different thousand separator 

案例2 c)

 NumberStyles styles = NumberStyles.AllowDecimalPoint; a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all! 

看似不好,但实际上好的例子:

案例2 a)好的

 a = Int32.Parse("-189"); //having - but in the beginning b = Int32.Parse(" 189 "); //having space, but in the beginning or end 

案例2 b)好的

 NumberStyles styles = NumberStyles.AllowThousands; a = Int32.Parse("1,189", styles); //ok, having NumberStyles.AllowThousands in the correct culture b = Int32.Parse("1 189", styles, new CultureInfo("fr-FR")); //ok, having NumberStyles.AllowThousands and correct thousand separator is used for "fr-FR" culture 

解决scheme

在所有情况下,请使用Visual Studiodebugging器检查textBox1.Text的值,并确保它对于int范围具有纯粹可接受的数字格式。 像这样的东西:

 1234 

另外,你可以考虑

  1. 使用TryParse而不是Parse来确保未分析的数字不会引起您的exception问题。
  2. 检查TryParse的结果并处理它,如果不true

     int val; bool result = int.TryParse(textbox1.Text, out val); if (!result) return; //something has gone wrong //OK, continue using val 

这也是我的问题..在我的情况下,我改变了PERSIAN号码为拉丁号码,它的工作。 而且在转换之前还要细化string。

 PersianCalendar pc = new PersianCalendar(); char[] seperator ={'/'}; string[] date = txtSaleDate.Text.Split(seperator); int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());