将文本框限制为1位小数。 Winform C#

时间:2014-09-22 06:39:20

标签: c# winforms

我正在使用c#开发一个winform应用程序我已成功实现了一种将文本框限制为两位小数的方法。我该怎么做到小数点后一位呢。 ?

我的两位小数的代码。\

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 = true;

输出

This is the output

5 个答案:

答案 0 :(得分:3)

你可以在没有正则表达式的情况下执行此操作,只需检查文本中小数分隔符的位置,然后确保小于字符串长度的2(小数点后1位,数组长度小1位)

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

答案 1 :(得分:0)

不要使用TextBox控件来输入,而是使用MaskedTextbox控件来输入。这将减轻输入的任何自我验证,并且可以向用户显示他们对于他们输入不正确的消息可以期望的输入。

有关MaskedTextbox控件的更多信息:
MaskedTextbox
MaskedTextbox.Mask property
MSDN Walkthrough: Working with the MaskedTextBox Control

答案 2 :(得分: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;
    }

答案 3 :(得分: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设置或获取您的值

答案 4 :(得分: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)