Как добавить числовое текстовое поле в WP7, которое может принимать значение с плавающей запятой? - PullRequest
2 голосов
/ 25 марта 2011

Я занимаюсь разработкой приложения WP7.Я новичок в WP7.Я также новичок в серебряном свете.У меня есть текстовое поле в моем приложении.В этом текстовом поле пользователь вводит сумму.Я хочу указать средство в моем приложении, чтобы пользователь мог ввести сумму с плавающей запятой (например, 1000,50 или 499,9999).Пользователь должен иметь возможность ввести две или четыре цифры после «.».Мой код для текстового поля выглядит следующим образом.

<TextBox InputScope="Number" Height="68" HorizontalAlignment="Left" Margin="-12,0,0,141" Name="AmountTextBox" Text="" VerticalAlignment="Bottom" Width="187" LostFocus="AmountTextBox_LostFocus" BorderBrush="Gray" MaxLength="10"/>

Я выполнил следующие проверки для вышеуказанного текстового поля.

public void AmountTextBox_LostFocus(object sender, RoutedEventArgs e)
        {
            foreach (char c in AmountTextBox.Text)
            {                
                if (!char.IsDigit(c))
                {
                    MessageBox.Show("Only numeric values are allowed");
                    AmountTextBox.Focus();
                    return;
                }
            }
        }

Как решить вышеуказанную проблему.Можете ли вы предоставить мне любой код или ссылку, с помощью которой я могу решить вышеуказанную проблему.Если я делаю что-то не так, пожалуйста, направьте меня.

Ответы [ 4 ]

3 голосов
/ 25 марта 2011

Скачать бесплатную книгу Программирование Windows Phone 7 от Чарльза Петцольда.На странице 380, в разделе Обновления привязки TextBox , в разделе Глава 12: Привязки данных , у него есть отличный пример проверки ввода с плавающей запятой.

Чтобы ограничить ввод пользователя 2 или 4 десятичными знаками, вам необходимо добавить некоторую логику в TextChanged обратный вызов TextBox.Например, вы можете преобразовать число с плавающей точкой в ​​строку, найти десятичное число, а затем вычислить длину строки справа от десятичного числа.

С другой стороны, если вы просто хотите округлитьпользователь вводит 2 или 4 цифры, взгляните на спецификатор формата с фиксированной точкой ("F") на этой странице.

2 голосов
/ 19 марта 2012

Я выполняю проверку таким образом, как показано в коде ниже.

Нет необходимости проверять char по char, уважается культура пользователя!

namespace Your_App_Namespace
{
public static class Globals
{
    public static double safeval = 0; // variable to save former value!

    public static bool isPositiveNumeric(string strval, System.Globalization.NumberStyles NumberStyle)
    // checking if string strval contains positive number in USER CULTURE NUMBER FORMAT!
    {
        double result;
        boolean test;
        if (strval.Contains("-")) test = false;
        else test = Double.TryParse(strval, NumberStyle, System.Globalization.CultureInfo.CurrentCulture, out result);
        // if (test == false) MessageBox.Show("Not positive number!");
        return test;
    }

    public static string numstr2string(string strval, string nofdec)
    // conversion from numeric string into string in USER CULTURE NUMBER FORMAT!
    // call example numstr2string("12.3456", "0.00") returns "12.34"
    {
        string retstr = "";
        if (Globals.isPositiveNumeric(strval, System.Globalization.NumberStyles.Number)) retstr = double.Parse(strval).ToString(nofdec);
        else retstr = Globals.safeval.ToString(nofdec);
        return retstr;
    }

    public static string number2string(double numval, string nofdec)
    // conversion from numeric value into string in USER CULTURE NUMBER FORMAT!
    // call example number2string(12.3456, "0.00") returns "12.34"
    {
        string retstr = "";
        if (Globals.isPositiveNumeric(numval.ToString(), System.Globalization.NumberStyles.Number)) retstr = numval.ToString(nofdec);
        else retstr = Globals.safeval.ToString(nofdec);
        return retstr;
    }
}

// Other Your_App_Namespace content

}

// This the way how to use those functions in any of your app pages

    // function to call when TextBox GotFocus

    private void textbox_clear(object sender, System.Windows.RoutedEventArgs e)
    {
        TextBox txtbox = e.OriginalSource as TextBox;
        // save original value
        Globals.safeval = double.Parse(txtbox.Text);
        txtbox.Text = "";
    }

    // function to call when TextBox LostFocus

    private void textbox_change(object sender, System.Windows.RoutedEventArgs e)
    {
        TextBox txtbox = e.OriginalSource as TextBox;
        // text from textbox into sting with checking and string format
        txtbox.Text = Globals.numstr2string(txtbox.Text, "0.00");
    }
0 голосов
/ 26 марта 2011

Следующий код работает нормально для меня. Я проверил это в моем приложении. В следующем коде, добавив некоторые проверки, мы можем рассматривать наше общее текстовое поле как числовое текстовое поле, которое может принимать значения с плавающей точкой.

public void AmountTextBox_LostFocus(object sender, RoutedEventArgs e)
        {
            foreach (char c in AmountTextBox.Text)
            {                
                if (!char.IsDigit(c) && !(c == '.'))
                {
                    if (c == '-')
                    {
                        MessageBox.Show("Only positive values are allowed");
                        AmountTextBox.Focus();
                        return;
                    }

                    MessageBox.Show("Only numeric values are allowed");
                    AmountTextBox.Focus();
                    return;
                }
            }

            string [] AmountArr = AmountTextBox.Text.Split('.');
            if (AmountArr.Count() > 2)
            {
                MessageBox.Show("Only one decimal point are allowed");
                AmountTextBox.Focus();
                return;
            }

            if (AmountArr.Count() > 1)
            {
                int Digits = AmountArr[1].Count();
                if (Digits > 2)
                {
                    MessageBox.Show("Only two digits are allowed after decimal point");
                    AmountTextBox.Focus();
                    return;
                }
            }
        }
0 голосов
/ 25 марта 2011

Вы всегда можете использовать это регулярное выражение [- +]? [0-9] .? [0-9] , чтобы определить, является ли оно плавающим числом.

public void AmountTextBox_LostFocus(object sender, RoutedEventArgs e)
  {
      Regex myRange = new Regex(@"[-+]?[0-9]*\.?[0-9]");
      if (myRange.IsMatch(textBox1.Text))
        // Match do whatever
      else
        // No match do whatever
  }
...