2013-03-01 7 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

が、これは 'おそらく100,000.00''こと1,00,000.00'べきでしょうか? – Neolisk

答えて

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イベントを購読して、値がいつ変更されたかを知ることができます。

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 
} 
関連する問題