【问题标题】:Input string was not in a correct format. c# (New)输入字符串的格式不正确。 c# (新)
【发布时间】:2016-04-13 12:48:24
【问题描述】:

我遇到“输入字符串的格式不正确”。此代码错误

rainTb.Text = " " + int.Parse(parsed[0]) * 100 / 1023;

我的代码没有错误。除了上面的错误。我进行了计算,通过串行通信(电缆)从 Arduino 硬件中提取模拟值(以上计算)。 Arduino 工作正常。一切都很好,直到出现这个错误......为什么? 哭泣

p/s:我已经经历了很多解决方案,但仍然......所以我现在在这里。对不起我的英语

private void ProcessCOMRx(object sender, EventArgs e)
    {

        if (!string.IsNullOrEmpty(COMRx))
        {
            systemTb.Text = "Processing Data...";
            systemTb.BackColor = System.Drawing.Color.Lime;
            string [] parsed = COMRx.Split(',');
            int curveNo;

            if (parsed.Count() > zedAll.GraphPane.CurveList.Count())
               curveNo = zedAll.GraphPane.CurveList.Count();                
            else                
                curveNo = parsed.Count();                

            for (int k = 0; k < curveNo; k++)
            {
                for (int j = zedAll.GraphPane.CurveList[k].NPts - 1; j > 0; j--)
                {
                    zedAll.GraphPane.CurveList[k].Points[j].Y = zedAll.GraphPane.CurveList[k].Points[j - 1].Y;
                }
                double temp = 0;                    
                try
                {
                    temp = double.Parse(parsed[k]);
                }                    
                catch                    
                {
                    systemTb.Text = "Parse Error";
                    systemTb.BackColor = System.Drawing.Color.Red;
                }
                rainTb.Text = "" + int.Parse(parsed[0]) * 100 / 1023;
                phTb.Text = "" + (3.5 + int.Parse(parsed[1]) * 4.5 / 1023);
                moistTb.Text = "" + int.Parse(parsed[2]) * 100 / 1023;
                tempTb.Text = "" + int.Parse(parsed[3]) * 100 / 1023;


                zedAll.GraphPane.CurveList[k].Points[0].X = 0;
                zedAll.GraphPane.CurveList[k].Points[0].Y = temp;                  
            }

        }
        else
        {                
            this.BeginInvoke(new EventHandler(processPumpStates));
        }

    }

【问题讨论】:

  • 我的数据是通过串行通信。从 Arduino 到 Visual Studio。 Arduino 工作正常
  • 你的调试器说parsed[ 0 ]包含什么?我猜这不仅仅是带有可选前导-的数字。
  • parse[0] 包含什么?
  • 您的评论似乎与您的问题相关,应该添加到问题中,而不是作为评论发布。
  • parsed[0]的内容是什么

标签: c# visual-studio arduino


【解决方案1】:

发生这种情况的可能情况很少。一个是因为 (1) parsed[0] 数字是 too big,另一个是因为 parsed[0] 包含 (2) 非数字,(3) 无法识别的千位分隔符,或 (4) 小数分隔符(不应该存在于int 解析)在您的代码的应用文化中。

在所有情况下,请使用您的 Visual Studio 调试器检查parsed[0] 的值,并确保它在int 范围内具有完全可接受的数字格式。比如:

1234

另外,你可以考虑

  1. 使用TryParse而不是Parse来确保未解析的数字不会导致您出现异常问题。
  2. 使用ToString()打印你的数值计算结果,
  3. 检查TryParse
  4. 的结果
  5. 注意您在原始int.Parse(parsed[0]) * 100 / 1023 中可能执行的整数除法:

类似这样的:

 int val;
 bool result = int.TryParse(parsed[0], out val);
 if (!result)
     return; //something has gone wrong

 Textbox1.Text = " " + (val * 100d / 1023d).ToString(); //note the d

【讨论】:

  • 如果我有超过 1 个 parsed[0] 怎么办?
  • 我已经解析[1]、解析[2]和解析[3]
  • @AqilahZainuddin 您可以使用相同的逻辑并使用for 循环 - 前提是它们在逻辑过程中都相同或几乎相同。您可以将其作为一个问题来进一步澄清它是否与当前问题完全不同。
【解决方案2】:

如果parsed[0] 中包含的值是可转换的字符串,则您的代码工作正常,否则您会抛出您遇到的异常。即parsed[0]里面的内容是不能转换成整数的,这种情况你应该用int.TryParse代替int.Parse,它有内部错误处理,可以帮助你判断转换是否成功.

所以代码看起来像:

int tempNumber=0;
if (int.TryParse(parsed[0], out tempNumber))
{
    Textbox1.Text = " " + (tempNumber * 100 / 1023).ToString();
}
else 
{
    Textbox1.Text= "invalid zipCode";
}

【讨论】:

  • 哦,所以我的代码不能这样使用?好的会改成这个的。谢谢:)
  • 先生,如果我有超过 1 个 parsed[0] 怎么办?
  • 我已经解析[1]、解析[2]和解析[3]
猜你喜欢
  • 2021-11-24
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多