从文本框中提取数字
本文关键字:提取 数字 文本 | 更新日期: 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]", "");