Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
769 views
in Technique[技术] by (71.8m points)

winforms - How to make a textbox accept only digits and formats numbers with commas?

I need a text box that:

(1) only accepts digits as characters.

(2) automatically continues to format numeric values with commas as the user types into it.

For example,

     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

How to achieve that?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Formatting a number while the user is typing in general works very poorly. You should use a MaskedTextBox for that. Plenty of code about on the Internet that shows how to filter KeyPress so only digits can be entered. Most of it is trivially defeated by using the Paste command.

The sane way is to treat the user capable of basic skills like typing a number and gently remind her that she got it wrong. The Validating event is made for that. Which is also the perfect time to format the number. Add a new class to your project and paste this code:

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

Compile. Drop the new NumberBox control from the top of the toolbox onto your form. Also drop an ErrorProvider on the form so typing mistakes can be reported in modest way, set the ErrorProvider property of the new control. Optionally modify the Fraction property. You can subscribe the ValueChanged event to know when the value was modified.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...