【问题标题】:C# Search for first number in integer/stringC#在整数/字符串中搜索第一个数字
【发布时间】:2017-06-19 10:49:00
【问题描述】:

我有一个文本框,人们必须在其中输入一个数字,但我不想让他们先输入数字 0,我该怎么做?

示例:如果他们输入 10 就可以,但如果他们输入 010 就不行,我希望出现一个窗口并告诉他们再试一次。

谢谢!

【问题讨论】:

  • 您是在谈论 Windows 窗体、WPF 还是任何其他 UI 框架?请使用相关标签。
  • 好的 - 那么你尝试了什么?
  • 此外,请出示您的优惠,尤其是您的代码。
  • 是的窗体
  • bool ok = text.Length > 0 && text[0] != (char)0x30; ?

标签: c# string winforms integer


【解决方案1】:

也许你可以有一个 ViewModel 代表一些文本框,其中之一是你的“数字”文本框。然后,您可以使用 Number 属性上的属性来确保它被验证。

public class MyViewModel
{
   ...

    [Required]
    [NumberValidation]
    string NumberTextBox {get;set;}

其中 NumberValidation 是另一个实现 ValidationAttribute 的公共类

[AttributeUsage(AttributeTargets.Property]
public class NumberValidation : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value.StartsWith("0"))
        {
                return new ValidationResult(ErrorMessage, "Please enter another number!");
        }
        return ValidationResult.Success;
    }
}

【讨论】:

    【解决方案2】:

    TextChanged 处理程序添加到您的文本框(在您的表单中查找文本框的事件并输入此名称:TextBox_TextChanged):

    void TextBox_TextChanged(object sender, EventArgs e)
    {
        var textBox = sender as TextBox;
    
        if (textBox != null)
        {
            textBox.Text = textBox.Text.Trim();
    
            if (textBox.Text.Length > 0 && textBox.Text[0] == '0')
            {
                textBox.Text = textBox.Text.TrimStart('0');
                MessageBox.Show("Incorrect value");
            }                
        }
    }
    

    或者在代码中:

    TextBox textBox = new TextBox();
    textBox.TextChanged += TextBox_TextChanged;
    

    【讨论】:

    • 当发件人不是TextBox时,这会产生NullReferenceException
    • e.Handled = true;把手变成红色
    • 基本EventArgs 中没有Handled 属性。
    【解决方案3】:

    使用TextChanged 事件。 (双击设计器中文本框属性中的事件)在此示例中,在比较之前修剪所有前导空格,如果是0,则删除该字符

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string input = textBox1.Text.TrimStart(' ');
        if (input.Length == 1)
        {
            textBox1.Text = input == "0" ? "" : input;
        }
    }
    

    编辑

    正如 m.rogalski 和 Roma 所指出的,上述版本允许在输入有效字符后输入 0。下面这个版本将纠正这个错误:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        textBox1.Text = textBox1.Text.TrimStart('0');
    }
    

    【讨论】:

    • 这只是检查输入是否为 1 符号长,这意味着它不会在 010 中首先捕获 0
    • @m.rogalski 不完全是。它只作用于第一个真正的角色。它不允许您将0 作为第一个字符
    • @MongZhu,但是你可以先输入1,然后在1之前输入0,会失败
    • 您可以将文本复制并粘贴到此框中,在这种情况下您的方法将失败。如果有人插入 1 然后是 0 然后 1 然后删除第一个 1 使全文 01 有 2 个符号,则另一个失败将是。
    • @m.rogalski 你是对的。在我的帖子中进行了更正。谢谢
    【解决方案4】:

    从头开始:

    如果他们输入,10 可以,但如果他们输入 010,那就不行了

    如果用户可以输入从0infinity 的整数,那么你可以使用这个:

    if(textBox.Text.Length > 1 && textBox.Text[0] == '0')
    

    这假设用户可以键入“0”作为第一个符号,只有当它是唯一的符号时。如果这不是您想要的,那么将其更改为:

    if(textBox.Text.Length > 0 && textBox.Text[0] == '0')
    

    走得更远:

    我希望出现一个窗口并告诉他们再试一次

    您可以只显示MessageBox 并在textBox 中显示明文:

    textBox.Text = string.Empty;
    MessageBox.Show("Value entered is incorrect. Please try again");
    

    然后结合这些你会得到类似的东西:

    if(textBox.Text.Length > 1/* or 0 depending on what you need */ && textBox.Text[0] == '0')
    {
        textBox.Text = string.Empty;
        MessageBox.Show("Value entered is incorrect. Please try again");
    }
    

    【讨论】:

      【解决方案5】:

      这应该可行:

      private void MyTextBox_TextChanged(object sender, EventArgs e)
      {      
          var textBox = sender as TextBox;   
          if (textBox.Text.StartsWith("0"))      
              //alert user      
              MessageBox.Show("Invalid starting character");      
      }
      

      当然你需要在设计器中绑定 TextChanged 事件,或者像这样的代码:

      MyTextBox.TextChanged += MyTextBox_TextChanged;
      

      【讨论】:

        【解决方案6】:

        将此代码放在 Initialize 方法之后

        textBox1.TextChanged = (s, o) =>
        {
            if (textBox1.Text.StartsWith("0"))
            {
                textBox1.Text = textBox1.Text.Remove(0, 1);
                MessageBox.Show("Cant start with '0'");
            }
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-07
          • 2012-07-20
          • 2015-01-24
          • 2020-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-28
          相关资源
          最近更新 更多