如何使文本框只接受数字并用逗号格式化数字?
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
【讨论】:
以上是关于如何使文本框只接受数字并用逗号格式化数字?的主要内容,如果未能解决你的问题,请参考以下文章
Excel表中。超过15位数以上的数字。会被转换成科学计数法。有没有啥办法让他正常显示??前面加逗号啥