2013-03-01 108 views
6

我需要一个文本框:如何使文本框只接受数字并用逗号格式化数字?

(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 

如何实现这一目标?

+0

如果这'1,00,000.00'是'100,000.00'吧? – Neolisk 2013-03-11 16:35:22

回答

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

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); 
} 

注:这是简单明了的,如果你需要更多的东西阐述(最佳做法和所有的东西...)是指汉斯的答案。

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 
} 
相关问题