从文本框中提取数字

时间:2014-09-25 17:51:07

标签: c# numbers text-extraction

我有一个包含字母和数字的文本框以及您可以在键盘上找到的其他符号。我有这个代码,当我手动输入数据时工作正常,它只允许我输入数字和删除字母。我想要的一切,除了复制和粘贴数据之外没有任何效果。下面是我的代码。

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) { }

    }
}

4 个答案:

答案 0 :(得分:0)

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

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]", "");

答案 1 :(得分:0)

基本上你的问题是,粘贴一个值只会为整个更改调用一次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();
}

答案 2 :(得分:0)

您当前代码的问题在于您只从光标位置删除最后输入的字符。粘贴多个字符的文字会破坏你的算法。

所以,让我们说你用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;
}

答案 3 :(得分:0)

试试这个。它将旧值保存在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;
    }
}