如何使文本框仅接受数字并用逗号格式化数字?

时间:2013-03-01 17:34:35

标签: winforms c#-2.0

我需要一个文本框:

(1)只接受数字作为字符。

(2)在用户输入逗号时自动继续使用逗号格式化数值。

例如,

     1 becomes        1.00
    10 becomes       10.00
   100 becomes      100.00
  1000 becomes    1,000.00
 10000 becomes   10,000.00
100000 becomes 1,00,000.00

如何实现?

4 个答案:

答案 0 :(得分:4)

在用户输入时格式化数字通常效果很差。您应该使用MaskedTextBox。互联网上有大量关于如何过滤KeyPress的代码,因此只能输入数字。通过使用粘贴命令,大部分都被忽略了。

理智的方式是对待能够掌握基本技能的用户,比如输入一个数字,然后温柔地提醒她,她弄错了。验证事件就是为此而做的。这也是格式化数字的最佳时机。在项目中添加一个新类并粘贴此代码:

using System;
using System.ComponentModel;
using System.Windows.Forms;

public class NumberBox : TextBox {
    public NumberBox() {
        Fraction = 2;
    }

    public ErrorProvider ErrorProvider { get; set; }

    [DefaultValue(2)]
    public int Fraction { get; set; }

    public event EventHandler ValueChanged;
    public decimal Value {
        get { return this.value; }
        set {
            if (value != this.value) {
                this.value = value;
                this.Text = Value.ToString(string.Format("N{0}", Fraction));
                var handler = ValueChanged;
                if (handler != null) ValueChanged(this, EventArgs.Empty);
            }
        }
    }

    protected override void OnValidating(CancelEventArgs e) {
        if (this.Text.Length > 0 && !e.Cancel) {
            decimal entry;
            if (decimal.TryParse(this.Text, out entry)) {
                if (ErrorProvider != null) ErrorProvider.SetError(this, "");
                Value = entry;
            }
            else {
                if (ErrorProvider != null) ErrorProvider.SetError(this, "Please enter a valid number");
                this.SelectAll();
                e.Cancel = true;
            }
        }
        base.OnValidating(e);
    }

    protected override void OnEnter(EventArgs e) {
        this.SelectAll();
        base.OnEnter(e);
    }


    private decimal value;
}

编译。将新的NumberBox控件从工具箱顶部拖放到表单上。同时在表单上删除ErrorProvider,以便以适度的方式报告键入错误,设置新控件的ErrorProvider属性。 (可选)修改“分数”属性。您可以订阅ValueChanged事件以了解值的修改时间。

答案 1 :(得分:0)

答案 2 :(得分:0)

有一种非常简单的方法:使用TextChanged和Leave事件。

private void textBox_TextChanged(object sender, EventArgs e)
{
   decimal theNumber;
   if(!decimal.TryParse((sender as TextBox).Text, out theNumber))
   {
      (sender as TextBox).Text = string.empty;
   }
}

不要尝试格式化TextChanged事件中的数字,它会变得混乱。然后当用户离开文本框时改变格式。

private void textBox_Leave(object sender, EventArgs e)
{
   // Since you were validating the number while typing now there is no need for TryParse
   decimal theNumber = decimal.Parse((sender as TextBox).Text);
   (sender as TextBox).Text = string.Format("{0:N2}", theNumber);
}

注意:如果您需要更详细的内容(最佳实践和所有内容......),请参阅Hans答案,这很简单明了。

答案 3 :(得分:0)

我不知道这是否会有所帮助,但在这里:

try
{
    double number = Convert.toDouble(textBox.Text);
    string[] digits = Regex.Split(textBox.Text, @"\W+");
    int x = 0;
    List<string> finalNumber = new List<string>();
    while(x < numbers.Length)
    {
        if(digits[x] == ".")
            break;
        if(x%3 = 0 && x != 0)
        {
            finalNumber.Add(",");   
        }
        finalNumber.Add(digits[x]);
        x++;
    }
    string finalNumberJoined = "";
    foreach(var digit in finalNumber)
    {
        finalNumberJoined = finalNumberJoined + digit;
    }
}
catch
{
    //not a number
}