2013-03-01 18 views
6

Ho bisogno di una casella di testo che:Come fare una casella di testo accetta solo cifre e formati numeri con virgole?

(1) accetta solo cifre come caratteri.

(2) continua automaticamente a formattare valori numerici con virgole mentre l'utente digita in esso.

Per esempio,

 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 

Come raggiungere questo?

+0

caso questo '1,00,000.00' essere' 100,000.00' forse? – Neolisk

risposta

4

formattazione di un certo numero mentre l'utente sta digitando in opere generali molto male. Dovresti usare un MaskedTextBox per questo. Un sacco di codice su Internet che mostra come filtrare KeyPress in modo da poter inserire solo le cifre. La maggior parte di essa viene banalmente sconfitta usando il comando Incolla.

Il modo corretto è di trattare l'utente capace di abilità di base come digitare un numero e ricordarle gentilmente che ha sbagliato. L'evento Validating è fatto per quello. Qual è anche il momento perfetto per formattare il numero. Aggiungi una nuova classe al tuo progetto e incolla questo codice:

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

Compila. Rilasciare il nuovo controllo NumberBox dalla parte superiore della casella degli strumenti sul modulo. Lasciare anche un ErrorProvider sul modulo in modo che gli errori di battitura possano essere riportati in modo modesto, impostare la proprietà ErrorProvider del nuovo controllo. Modificare facoltativamente la proprietà Fraction. È possibile sottoscrivere l'evento ValueChanged per sapere quando il valore è stato modificato.

0

C'è un modo molto semplice: usare TextChanged e lasciare eventi.

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

Non provare a formattare il numero nell'evento TextChanged che diventa disordinato. Quindi, quando l'utente lascia la casella di testo, modifica il formato.

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

Nota: Questa è pura e semplice, se avete bisogno di qualcosa di più elaborato (best practice e tutto il resto ...) si riferiscono a Hans risposta.

0

Non so se questo è di aiuto andando, ma qui va:

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 
}