从文本框中提取数字

本文关键字:提取 数字 文本 | 更新日期: 2023-09-27 18:24:22

我有一个文本框,里面有字母和数字,还有其他可以在键盘上找到的符号。我有这样的代码,当我手动输入数据时,它可以很好地工作,它只允许我输入数字和删除字母。所有我想要的东西,除了如果数据被复制和粘贴,它们都不起作用。下面是我的代码。

private void textBox7_TextChanged(object sender, EventArgs e)
{
    Exception X = new Exception();
    TextBox T = (TextBox)sender;
    T.Text = T.Text.Trim();
    try
    {
        if (T.Text != "-")
        {
            int x = int.Parse(T.Text);
        }
    }
    catch (Exception)
    {
        try
        {
            int CursorIndex = T.SelectionStart - 1;
            T.Text = T.Text.Remove(CursorIndex, 1);
            //Align Cursor to same index
            T.SelectionStart = CursorIndex;
            T.SelectionLength = 0;
        }
        catch (Exception) { }
    }
}

从文本框中提取数字

当前代码的问题是,您只从光标位置删除了最后一个输入的字符。粘贴超过一个字符的文本会破坏你的算法。

假设你粘贴了9个字母,CursorIndex为9,你只删除了一个字符(即T.Text = T.Text.Remove(CursorIndex, 1);行),剩下8个不正确的字符。

一个更好的方法(不像你的方法那样过于复杂)看起来是这样的:

private void textBox7_TextChanged(object sender, EventArgs e)
{
    textBox7.Text = string.Concat(textBox7.Text.Where(char.IsDigit));
}

因此,在这里,我们将在每次更改时用包含通过char.IsDigit测试的每个字符的新文本替换文本。但是,光标不会处于正确的位置。除非预期在字符串中间进行多次编辑,否则最好只绑定一个

textBox1.SelectionStart = textBox1.Text.Length;

在方法的末尾,它还将处理粘贴的文本。

当字符-是文本框中唯一的文本时,要处理不想擦除该字符的情况,可以添加一个明显的if条件。在全球范围内,它将是这样的:

private void textBox7_TextChanged(object sender, EventArgs e)
{
    if (textbox7.Text != "-")
        textBox7.Text = string.Concat(textBox7.Text.Where(char.IsDigit));
    textBox1.SelectionStart = textBox1.Text.Length;
}

试试这个。它将旧值保存在var中,如果无法解析新值,则将文本还原为old。否则,它将old更新为最新的有效值。这是一种与你不同的方法,但在我看来要简单得多。

string old;
private void textBox7_TextChanged(object sender, EventArgs e) {
    int i;
    if (textBox1.Text == "" || int.TryParse(textBox7.Text, out i)) {
        old = textBox7.Text;
    } else {
        textBox7.Text = old;
    }
}

基本上,您的问题是粘贴一个值对于整个更改只调用一次TextChanged事件。您的代码依赖于为放入文本框中的每个字符调用的事件。

听起来你真正想做的就是在可能的负号之后过滤所有非数字值。如果是这样的话,你可以这样做。

private void textBox7_TextChanged(object sender, EventArgs e)
{
    textBox7.Text = string.Concat(
        textBox7.Text.Trim().Where((c,i)=>char.IsDigit(c) || (i==0 && c=='-')));
}

这段代码使用Linq遍历每个字符,去掉前导和尾部空白,如果它是第一个字符,则只保留数字或负号。它相当于以下内容。

private void textBox7_TextChanged(object sender, EventArgs e)
{
    StringBuilder builder = new StringBuilder()
    string trimmed = textBox7.Text.Trim();
    for(int i=0; i<trimmed.Length; i++)
    {
        char c = trimmed.Text[i];
        if(char.IsDigit(c) || (i==0 && c=='-'))
        {
            builder.Append(c);
        }
    }
    textBox7.Text = builder.ToString();
}

要从文本框的文本中删除非数字字符,请尝试使用Regex替换正则表达式。替换

private void numericTextbox_TextChanged(object sender, EventArgs e)
{
    TextBox tb = (TextBox)sender;
    tb.Text = Regex.Replace(tb.Text, "''-?[^'d]", "");
}

每当框中的文本发生变化时,无论用户是直接键入还是从其他地方粘贴文本,这都会将文本中的任何非数字字符(除了前面的短划线,表示负数)替换为零。

或者,如果你想保留任何破折号(比如电话号码):

tb.Text = Regex.Replace(tb.Text, "''[^-'d]", "");