Разбор чисел в PreviewTextInput - PullRequest
2 голосов
/ 08 июня 2010

У меня есть приложение WPF, в котором у меня есть ловушка в PreviewTextInput, через которую я получаю текущий введенный символ, и у меня уже есть введенная строка. Учитывая это, мне нужно написать следующую функцию:

bool ShouldAccept(char newChar,string existingText)

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

В моем коде (если он еще основан) в настоящее время есть много недостатков, я хотел бы знать, есть ли какой-нибудь умный способ сделать это.

Ответы [ 2 ]

2 голосов
/ 08 июня 2010

Я бы порекомендовал сделать это в двух чеках:

Первая проверка : найти действительный новый символ.Вы, вероятно, должны принимать только цифры, запятую, точку, + - и букву e.Любой другой символ должен заставить его возвращать false

Вторая проверка : добавить новый символ в строку, разделить его на запятые, используя метод split , и для каждой отдельной строки выполнить TryParse метод с плавающей запятой / двойной.Возможно, вам следует по-разному относиться к последней строке из разбитых элементов, поскольку ввод может продолжаться (т. Е. Строка, заканчивающаяся точкой, вероятно, не будет проанализирована.

Просто помните, что вам понадобится "скажите парсеру, что точки и другие символы разрешены и как они должны обрабатываться. Для меня следующие параметры работают нормально:

System.Globalization.CultureInfo info = new System.Globalization.CultureInfo("en-GB");
System.Globalization.NumberStyles styl = System.Globalization.NumberStyles.AllowDecimalPoint;
double.TryParse(someString, styl, info, out number);`

И еще одно: если можете, измените знак разделения с запятойдо точки с запятой. В некоторых культурах запятая используется для обозначения десятичной точки.

1 голос
/ 11 июня 2010

Я наконец сделал это с помощью Regex,

private readonly List<Regex> ValidNumberRegex = new List<Regex>
                                {
                                    new Regex(@"^-?$"),
                                    new Regex(@"^-?\d+$"),
                                    new Regex(@"^-?\d+\.$"),
                                    new Regex(@"^-?\d+\.\d+$"),
                                    new Regex(@"^-?\d+\.\d+[eE]$"),
                                    new Regex(@"^-?\d+\.\d+[eE]-?$"),
                                    new Regex(@"^-?\d+\.\d+[eE]-?\d+$"),
                                    new Regex(@"^-?\d+[eE]-?$"),
                                    new Regex(@"^-?\d+[eE]-?\d+$"),
                                };

Таким образом, в основном мой ShouldAccept выглядит так:

  1. Если ввод является первым символом, то разрешается только «-» или 0-9
  2. Иначе, если input - ",", затем разделить существующий текст на "," и проверить все существующие числа
  3. Для всех остальных входных данных выясните текущий номер (это может быть изменение существующего номера или продолжение последнего номера), после выяснения его подтвердите номер с помощью newchar

Всего 50 строк кода. Я мог бы объединить все регулярные выражения, но это гораздо легче читать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...