Better Call Zam

Textbox que sólo permita números C#

Es común necesitar un Textbox que sólo permita la inserción de números, por ejemplo si se trata de una caja que contenga un número de teléfono o una cantidad con punto decimal.

Para este caso lo que puedes hace es recorrer el string de lo que se escribió y comparar los caracteres o aplicar el evento KeyDown, el cual ni siquiera permite que se escriba todo lo ajeno a lo que definas. Este código no permite escribir más que números:


                private void tbMovil_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
                {
                    if (e.Key >= Key.D0 && e.Key <= Key.D9 || e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)
                        e.Handled = false;
                    else
                        e.Handled = true;
                }
                    

Y este código te permite escribir la coma "," porque en mi caso es el separador decimal.


                private void tbPrecio_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
                {
                    if (e.Key >= Key.D0 && e.Key <= Key.D9 || e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)
                        e.Handled = false;
                    else if (e.Key == Key.OemComma)
                        e.Handled = false;
                    else
                        e.Handled = true;
                }
            

Si estás seguro que tu caracter decimal es el punto, usa este. Además, está validado que sólo deje introducir un punto decimal ( "." = Key.OemPeriod). La variable puntos es global.


                    private void tbPrecio_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
                    {
                        if (e.Key >= Key.D0 && e.Key <= Key.D9 || e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)
                            e.Handled = false;
                        else if (e.Key == Key.OemPeriod)
                        {
                            if (puntos == 0)
                            {
                                e.Handled = false;
                                puntos = 1;
                            }
                            else
                            {
                                e.Handled = true;
                            }
                        }
                        else
                            e.Handled = true;
                    }
                

Cómo saber si debo usar la coma "," o el punto "." como separador decimal por código

Yo sabía que era la coma porque el sistema es para inglés gringo y por lo tanto en el código anterior sólo deja escribir la coma y no el punto pero podrías saber cuál se usa en la región que sea en la que se use el sistema con:


    string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    string numero = tbPrecio.Text.TrimEnd(' '); ;
                    numero.Replace(".",decimalseparator); //Aquí se remplaza el punto por el separator que está en uso según la región
    
    

Por supuesto debes tener cuidado en caso de que lo vayas a guardar en SQL ya que igual debes usar el formato que SQL pide, según lo hayas definido.