2013-03-01 11 views
6

Potrzebuję pola tekstowego, które:Jak zrobić pole tekstowe akceptować tylko cyfry i numery formatów za pomocą przecinków?

(1) przyjmuje tylko cyfry jako znaki.

(2) automatycznie kontynuuje formatowanie wartości numerycznych przecinkami, gdy użytkownik je wpisze.

Na przykład

 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 

Jak to osiągnąć?

+0

Gdyby to '' 100,000.00' 1,00,000.00' być może? – Neolisk

Odpowiedz

4

Formatowanie liczby podczas użytkownik wpisując w pracach ogólnych bardzo słabo. Powinieneś użyć MaskedTextBox do tego. Mnóstwo kodu w Internecie, który pokazuje, jak filtrować KeyPress, aby można było wprowadzać tylko cyfry. Większość z nich jest trywialnie pokonana za pomocą polecenia Wklej.

Sposobem rozsądnym jest traktowanie użytkownika zdolnego do podstawowych umiejętności, takiego jak wpisanie numeru, i delikatnie przypomnij jej, że źle zrobiła. Zdarzenie sprawdzania poprawności zostało wprowadzone w tym celu. Jest to również doskonały czas na sformatowanie numeru. Dodaj nową klasę do projektu i wklej ten kod:

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

Skompiluj. Rzuć nową kontrolkę NumberBox z góry przybornika na formularz. Również upuść ErrorProvider na formularzu, więc błędy pisania można zgłaszać w skromny sposób, ustaw właściwość ErrorProvider nowego kontrolki. Opcjonalnie zmodyfikuj właściwość Fraction. Możesz subskrybować zdarzenie ValueChanged, aby wiedzieć, kiedy wartość została zmodyfikowana.

0

Istnieje bardzo prosty sposób: użycie opcji TextChanged i pozostawienie zdarzeń.

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

Nie próbuj formatować liczby w zdarzeniu TextChanged, ponieważ robi się brudny. Następnie, gdy użytkownik opuszcza pole tekstowe, zmień format.

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

Uwaga: To jest jasne i proste, jeśli potrzebujesz czegoś bardziej skomplikowanego (najlepsze praktyki i wszystkie rzeczy ...) odnoszą się do Hansa odpowiedź.

0

nie wiem, czy jest to pomogę, ale tu idzie:

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 
} 
Powiązane problemy