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

Posted

技术标签:

【中文标题】如何使文本框只接受数字并用逗号格式化数字?【英文标题】:How to make a textbox accept only digits and formats numbers with commas? 【发布时间】:2013-03-01 17:34:34 【问题描述】:

我需要一个文本框:

(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

如何实现?

【问题讨论】:

这个1,00,000.00应该是100,000.00吗? 【参考方案1】:

格式化一个数字用户在一般情况下输入的效果很差。您应该为此使用 MaskedTextBox。互联网上的大量代码显示了如何过滤 KeyPress 以便只能输入数字。使用粘贴命令可以轻松解决大部分问题。

理智的方法是对待能够输入数字等基本技能的用户,并温和地提醒她她弄错了。 Validating 事件就是为此而设计的。这也是格式化数字的最佳时机。向您的项目添加一个新类并粘贴此代码:

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("N0", 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 属性。可以选择修改 Fraction 属性。您可以订阅 ValueChanged 事件以了解值何时被修改。

【讨论】:

【参考方案2】:

您是否尝试过查看蒙版文本框?

http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox(v=vs.80).aspx

【讨论】:

【参考方案3】:

有一个非常简单的方法:使用 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 的回答。

【讨论】:

【参考方案4】:

我不知道这是否会有所帮助,但它就是这样:

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

【讨论】:

以上是关于如何使文本框只接受数字并用逗号格式化数字?的主要内容,如果未能解决你的问题,请参考以下文章

格式化c#文本框只允许数字字符[重复]

如何使输入字段接受依赖于区域设置的数字格式?

Excel表中。超过15位数以上的数字。会被转换成科学计数法。有没有啥办法让他正常显示??前面加逗号啥

delphi中如何让文本框只输入数字、减号、小数点、汉字和退格键

如何excel在数字后批量加上逗号

更改 CSV 文本中的数字区域设置格式(在数字中用逗号交换点)