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

それを達成する方法は?

4

4 に答える 4

4

ユーザーが入力している間に数値をフォーマットすることは、一般的に非常にうまく機能しません。そのためには 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("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 イベントをサブスクライブして、値がいつ変更されたかを知ることができます。

于 2013-03-04T17:50:58.707 に答える
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
}
于 2013-03-11T16:33:43.777 に答える
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);
}

注:これは単純明快です。さらに複雑なもの(ベストプラクティスなど)が必要な場合は、ハンスの回答を参照してください。

于 2013-03-05T03:33:38.513 に答える
0

マスクされたテキスト ボックスを見てみましたか?

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

于 2013-03-04T17:26:34.347 に答える