jueves, 3 de marzo de 2016

Textbox que sólo permita números C# WPF

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 deja 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 éste te deja 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 es el punto usa este. Además, está validado que sólo deje introducir sólo 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.

No hay comentarios:

Publicar un comentario