C#-正确验证整数

本文关键字:整数 验证 C#- | 更新日期: 2023-09-27 18:28:01

我目前正在使用windows窗体构建我的项目,遇到了一个小"问题"。

我让用户输入一个小时,该小时存储为int。我想向用户提供详细的反馈,以便他们在出现错误时准确地知道自己做错了什么。

如果没有给定值,则会引发格式异常。如果给定的不是整数,则抛出格式异常。

这意味着我不能直接告诉用户,由于1)没有值或2)不是整数,新项目无法添加,因为它们都使用相同的异常。

我该如何解决这个问题,最好的解决方案是什么?

非常感谢。

C#-正确验证整数

使用Int32.TryParse方法并检查返回值。在调用TryParse之前,您可以简单地检查是否没有输入任何值。

下面是MSDN中的一个用法示例:

  int number;
  bool result = Int32.TryParse(value, out number);
  if (result)
  {
     Console.WriteLine("Converted '{0}' to {1}.", value, number);         
  }
  else
  {
     if (value == null) value = ""; 
     Console.WriteLine("Attempted conversion of '{0}' failed.", value);
  }

一些与您的问题相关的示例代码;注意ValidateData特别是:

// called from ok button click or similar event
private void Accept()
{
   if (!ValidateData())
      return;
   SaveData();
   DialogResult = DialogResult.Ok;
   Dispose();
}
private bool ValidateData()
{
   int val;
   if (string.IsNullOrEmpty(mTextBox.Text))
      return FailValidation("Value can not be empty.", mTextBox);
   if (!int.TryParse(mTextBox.Text, out val))
       return FailValidation("Value was not an integer.", mTextBox);
   return true;
}
// do something with the value if you need
private void SaveData()
{       
}
// post a message to the user, and highlight the problematic control
// always evaluates to false
private bool FailValidation(string pMessage, Control pControl)
{
     if (pControl != null)
     {
        pControl.Focus();
        TextBox textBox = pControl as TextBox;
        if (textBox != null)
           textBox.SelectAll();
     }
     AlertBox(pMessage);
     return false;
}
// quick alert message method
private void AlertBox(string pMessage)
{
   return MessageBox.Show
   (
      pMessage,          
      Application.ProductName,
      MessageBoxButtons.OK,
      MessageBoxIcon.Exclamation,
      MessageBoxDefaultButton.Button1
   );
}

使用int.TryParse检查格式,如果整数在有效范围内,则在成功的情况下检查。使用String.IsNulOrEmpty检查空字符串。

如果我能提出一个可能的替代解决方案。。。最好的验证是从一开始就防止错误的输入。您可以通过使用时间选择器或下拉列表等控件来限制用户可以选择的值吗?对于超级用户来说,下拉列表仍然是键盘友好的,对于那些喜欢鼠标的人来说,它会更容易一些。每个人都赢。

这在Winforms中得到了很好的支持。使用Validating事件检查条目,使用ErrorProvider组件报告错误。一个示例事件处理程序:

    private void textBox1_Validating(object sender, CancelEventArgs e) {
        int hour;
        e.Cancel = true;
        if (textBox1.Text.Length == 0) errorProvider1.SetError(textBox1, "Can't be empty");
        else if (!int.TryParse(textBox1.Text, out hour)) errorProvider1.SetError(textBox1, "Not a number");
        else if (hour < 1) errorProvider1.SetError(textBox1, "Hour too small");
        else if (hour > 24) errorProvider1.SetError(textBox1, "Hour too large");
        else {
            e.Cancel = false;
            errorProvider1.SetError(textBox1, "");
        }
    }

然后,您只需要检查是否所有条目都令人满意。在对话框的OK按钮单击事件处理程序中使用ValidateChildren()方法:

    private void OKButton_Click(object sender, EventArgs e) {
        if (ValidateChildren()) this.DialogResult = DialogResult.OK;
    }