如何限制C#中的文本框仅接收数字和(点“。”或逗号“,”),在“。”或“,”之后仅允许2个数字字符

我正在尝试开发一个代码来限制TextBox使用C#只允许数字输入+逗号(“,”)或点(“。”)+点或逗号后只有2个数字所以这样看到可以输入的可能数字:

3213,04 = OK 3211,664 = Not 32.31 = OK 32.3214 = Not 334,,00 = Not 3247,.00 = Not 214.,00 = Not 32.. = Not 8465,0 = Ok 654.0 = Ok 

明白了我的目标? 我开发了代码

 private void txtValormetrocubico_KeyPress(object sender, KeyPressEventArgs e) { if (txtValormetrocubico.TextLength >= 0 && (e.KeyChar == (char)Keys.OemPeriod || e.KeyChar == (char)Keys.Oemcomma)) { //tests } else { if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != ',') { e.Handled = true; } // only allow one decimal point if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1) { e.Handled = true; } if (e.KeyChar == ',' && (sender as TextBox).Text.IndexOf(',') > -1) { e.Handled = true; } } } 

试试这个代码! 我希望这有帮助。 如果我能进一步帮助你,请告诉我。

这是我写的辅助function

 private bool alreadyExist(string _text , ref char KeyChar) { if (_text.IndexOf('.')>-1) { KeyChar = '.'; return true; } if (_text.IndexOf(',') > -1) { KeyChar = ','; return true; } return false; } 

这是您的按键事件处理程序

  private void txtValormetrocubico_KeyPress(object sender, KeyPressEventArgs e) { if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != ',') { e.Handled = true; } //check if '.' , ',' pressed char sepratorChar='s'; if (e.KeyChar == '.' || e.KeyChar == ',') { // check if it's in the beginning of text not accept if (txtValormetrocubico.Text.Length == 0) e.Handled = true; // check if it's in the beginning of text not accept if (txtValormetrocubico.SelectionStart== 0 ) e.Handled = true; // check if there is already exist a '.' , ',' if (alreadyExist(txtValormetrocubico.Text , ref sepratorChar)) e.Handled = true; //check if '.' or ',' is in middle of a number and after it is not a number greater than 99 if (txtValormetrocubico.SelectionStart != txtValormetrocubico.Text.Length && e.Handled ==false) { // '.' or ',' is in the middle string AfterDotString = txtValormetrocubico.Text.Substring(txtValormetrocubico.SelectionStart); if (AfterDotString.Length> 2) { e.Handled = true; } } } //check if a number pressed if (Char.IsDigit(e.KeyChar)) { //check if a coma or dot exist if (alreadyExist(txtValormetrocubico.Text ,ref sepratorChar)) { int sepratorPosition = txtValormetrocubico.Text.IndexOf(sepratorChar); string afterSepratorString = txtValormetrocubico.Text.Substring(sepratorPosition + 1 ); if (txtValormetrocubico.SelectionStart > sepratorPosition && afterSepratorString.Length >1) { e.Handled = true; } } } } 

我觉得你需要像Masked Textbox这样的东西,你有一些参考

http://msdn.microsoft.com/en-us/library/kkx4h3az.aspx http://www.c-sharpcorner.com/uploadfile/mahesh/maskedtextbox-in-C-Sharp/

另一种做你想要的方法是使用正则表达式

那么你可以创建一个通用函数并在keypress事件上调用它,这个代码是一个通用实例。

validate_textBox是一个通用函数

 private void validate_textBox(TextBox _text, KeyPressEventArgs e) { if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != ',') { e.Handled = true; } if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != ',') { e.Handled = true; } //check if '.' , ',' pressed char sepratorChar = 's'; if (e.KeyChar == '.' || e.KeyChar == ',') { // check if it's in the beginning of text not accept if (_text.Text.Length == 0) e.Handled = true; // check if it's in the beginning of text not accept if (_text.SelectionStart == 0) e.Handled = true; // check if there is already exist a '.' , ',' if (alreadyExist(_text.Text, ref sepratorChar)) e.Handled = true; //check if '.' or ',' is in middle of a number and after it is not a number greater than 99 if (_text.SelectionStart != _text.Text.Length && e.Handled == false) { // '.' or ',' is in the middle string AfterDotString = _text.Text.Substring(_text.SelectionStart); if (AfterDotString.Length > 2) { e.Handled = true; } } } //check if a number pressed if (Char.IsDigit(e.KeyChar)) { //check if a coma or dot exist if (alreadyExist(_text.Text, ref sepratorChar)) { int sepratorPosition = _text.Text.IndexOf(sepratorChar); string afterSepratorString = _text.Text.Substring(sepratorPosition + 1); if (_text.SelectionStart > sepratorPosition && afterSepratorString.Length > 1) { e.Handled = true; } } } } 

然后,您可以为表单中的每个文本框调用此代码的函数

  private void txtValormetrocubico_KeyPress(object sender, KeyPressEventArgs e) { validate_textBox(sender as TextBox, e); } private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { validate_textBox(sender as TextBox, e); }