2014-09-22 2 views
0

Я разрабатываю приложение winform, используя C#. Я успешно реализовал способ ограничить текстовое поле двумя десятичными знаками. Как я могу сделать это до одного десятичного знака. ? .Ограничить текстовое поле до 1 десятичного знака. Winform C#

Мой код для двух знаков после запятой \

private void txtHraRep_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      if (char.IsNumber(e.KeyChar) || e.KeyChar == '.') 
      { 
       if (Regex.IsMatch(
       txtHraRep.Text, 
       "^\\d*\\.\\d{2}$")) e.Handled = true; 
      } 
      else e.Handled = e.KeyChar != (char)Keys.Back; 
     } 

Изменение к "^ \ d * \ \ d {1} $.")) E.Handled = истина;

выход

This is the output

+2

Как насчет "^ \\ d * \\ \\ д {1} $." – bit

+0

я пробовал раньше. он не работал. он допускал более 1 числа после десятичного числа. – user3859356

+0

Пожалуйста, предложите способ ограничить ввод пользователем не более 1 значения после десятичного числа. – user3859356

ответ

3

Вы можете сделать это без регулярных выражений, просто проверяя, где десятичный разделитель в тексте, а затем убедившись, что 2 меньше, чем длина строки (1 десятичных Место и 1 меньше для длины массива)

var decSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; 
var idx = txtBasic.Text.IndexOf(decSeparator); 
if(idx + 2 >= txtBasic.Text.Length) 
    ... 
0

Вместо использования TextBox управления для ввода, смотрите на использовании MaskedTextbox сотрудничества ntrol для ввода. Это облегчит любую самостоятельную проверку ввода и может показать пользователям, какой вклад можно ожидать от них с сообщениями о том, почему их ввод неверен.

Более подробную информацию об управлении MaskedTextBox:
MaskedTextbox
MaskedTextbox.Mask property
MSDN Walkthrough: Working with the MaskedTextBox Control

0

Я просто попытался

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     { 
      if (char.IsNumber(e.KeyChar) || e.KeyChar == '.') 
      { 
       if (Regex.IsMatch(
       textBox1.Text, 
       "^\\d*\\.\\d{1}$")) e.Handled = true; 
      } 
      else e.Handled = e.KeyChar != (char)Keys.Back; 
     } 
    } 

, и она работала как положено. Он ограничил ввод одной цифрой после десятичной точки. Но вы можете ввести более одной десятичной точки, а затем еще больше цифр. Таким образом, вы можете попробовать

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (char.IsNumber(e.KeyChar) || ((e.KeyChar == '.') && (textBox1.Text.IndexOf('.')== -1))) 
     { 
      if (Regex.IsMatch(
       textBox1.Text, 
       "^\\d*\\.\\d{1}$")) e.Handled = true; 
     } 
     else e.Handled = e.KeyChar != (char)Keys.Back; 
    } 

или что-то вроде

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (char.IsNumber(e.KeyChar) || ((e.KeyChar == '.') && (textBox1.Text.IndexOf('.')== -1))) 
     { 
      if (textBox1.Text.IndexOf('.') > 0) 
      { 
       if (textBox1.Text.IndexOf('.') < textBox1.Text.Length - 1) 
        e.Handled = true; 
      } 
     } 
     else e.Handled = e.KeyChar != (char)Keys.Back; 
    } 
+0

ОК ПОПРОБУЕТ СВОЙ МЕТОИД СМОТРЕТЬ ХОРОШЕЕ МНЕ – user3859356

+0

Это предложение работает? – gottsche

0

Создать новую TextBox, который наследует TextBox как

[DefaultBindingProperty("Text")] 
[DefaultProperty("Text")] 
[DefaultEvent("ValueChanged")] 
public class SpecializedTextBox : TextBox 
{ 
    private bool _allowNegativeSign = false; 
    public bool AllowNegativeSign 
    { 
     get { return _allowNegativeSign; } 
     set { _allowNegativeSign = value; } 
    } 
    public decimal? DecimalValue 
    { 
     get 
     { 
      decimal k; 
      if (decimal.TryParse(this.Text, out k)) 
       return k; 
      else 
       return null; 
     } 
     set 
     { 
      if (value.HasValue) 
       this.Text = value.Value.ToString(); 
      else 
       this.Text = ""; 
     } 
    } 
    private void This_TextChanged(object sender, EventArgs e) 
    { 
     string s = base.Text; 
     int cursorpos = base.SelectionStart; 
     bool separatorfound = false; 
      for (int i = 0; i < s.Length;) 
      { 
       if (char.IsNumber(s[i])) 
        i++; 
       else if (AllowNegativeSign && i < System.Globalization.CultureInfo.CurrentUICulture.NumberFormat.NegativeSign.Length && s.StartsWith(System.Globalization.CultureInfo.CurrentUICulture.NumberFormat.NegativeSign)) 
        i++; 
       else if (!separatorfound && s[i].ToString() == System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator) 
       { 
        separatorfound = true; 
        i++; 
       } 
       else 
       { 
        s = s.Remove(i, 1); 
        if (i < cursorpos) 
         cursorpos--; 
       } 
      } 
     if (base.Text != s) 
     { 
      base.Text = s; 
      base.SelectionStart = cursorpos; 
      base.SelectionLength = 0; 
     } 
     if (ValueChanged != null) 
      ValueChanged(this, EventArgs.Empty); 
    } 
    public event EventHandler ValueChanged; 

    private void InitializeComponent() 
    { 
     this.SuspendLayout(); 
     // 
     // SpecializedTextBox 
     // 
     this.TextChanged += new System.EventHandler(this.This_TextChanged); 
     this.ResumeLayout(false); 
    } 
    public SpecializedTextBox() 
     : base() 
    { 
     InitializeComponent(); 
    } 
} 

теперь использовать это текстовое поле и использовать DecimalValue установить или получить ваше значение

0

попытка:

List<string> doubleList = new List<string>(new string[] 
     { 
      "12345", 
      "1234.5", 
      "123.45", 
      "12.345", 
      "1.2345", 
      "1.2", 
      "1.23", 
      "1.234", 
      "1.23.45", 
      "12.3", 
      "123.4", 
     }) { }; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     foreach (var x in doubleList) 
     { 
      int countNumber = Regex.Matches(x, @"[0-9]").Count; 
      int countOfDot = Regex.Matches(x, @"\.").Count; 

      if (countOfDot == 1 && countNumber != 0) //contains "." and any digit 
      { 
       Console.WriteLine(x); 
      } 
      else if (countOfDot == 0 && countNumber != 0) //not contains "." and any digit 
      { 
       Console.WriteLine(x); 
      } 
      else 
      { 
       //do nothing . . . 
      } 
     } 
    } 

выход:

all except for **1.23.45** (2dots) 
Смежные вопросы