Russian Qt Forum
Ноябрь 27, 2024, 04:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с маской для Validator  (Прочитано 3223 раз)
AntonUfo
Гость
« : Ноябрь 24, 2010, 11:58 »

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

"1 2 3" - можно вводить
" 1 2 3" - нельзя т.к. перед 1 пробел..
"1 2  3" - нельзя т.к. между 2 и 3 два пробела
Записан
crossly
Гость
« Ответ #1 : Ноябрь 24, 2010, 13:30 »

QRegExp("\\d\\s\\d\\s\\d")
Записан
AntonUfo
Гость
« Ответ #2 : Ноябрь 24, 2010, 15:42 »

QRegExp("\\d\\s\\d\\s\\d")

не упомянул такой момент:
- числа могут быть целые с любым количеством знаков
- их может быть сколь угодно много

как тогда Ваш пример нужно переписать ?

решено : QRegExp rx("(([\\d])+(\\s))+");
« Последнее редактирование: Ноябрь 24, 2010, 16:51 от AntonUfo » Записан
Waryable
Гость
« Ответ #3 : Ноябрь 24, 2010, 20:10 »

Честно говоря, я не очень понимаю зачем вообще использовать этот класс... Он очень громоздкий и сложен в понимании. В подобных случаях проще написать свой алгоритм. Анализ строк не такая уж сложная задача. Больше времени уйдет на отладку маски.
Записан
crossly
Гость
« Ответ #4 : Ноябрь 24, 2010, 21:25 »

Честно говоря, я не очень понимаю зачем вообще использовать этот класс... Он очень громоздкий и сложен в понимании. В подобных случаях проще написать свой алгоритм. Анализ строк не такая уж сложная задача. Больше времени уйдет на отладку маски.
велосипедостроитель.... ??
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Ноябрь 24, 2010, 22:23 »

Не проверял, ошибки возможны
Код
C++ (Qt)
inline bool ValidLong( const QString & s )
{
bool ok;
long test = s.toLong(&ok);
return ok;
}
 
bool ValidateStr( const QString & s, QChar space )
{
int prev, cur = 0, len = s.length();
while (cur >= 0) {
 prev = cur;
 cur = s.indexOf(space, prev);
 if (cur == 0) return false;  // first space (wrong)
 if (cur > 0) {
   int delta = cur - prev;
   if (delta < 2) return false; // space + space (wrong)
   if (!ValidLong(s.mid(last, delta)) return false;
   if (++cur >= len) break;   // last space (valid)
 }
 else {   // last substring
   QString sub = s.mid(prev);  
   if (sub == "+" || sub == "-") break;  // last is sign (valid)
   if (!ValidLong(sub)) return false;
 }
}
return true;
}
 
Записан
Kolobok
Гость
« Ответ #6 : Ноябрь 24, 2010, 23:38 »

Думаю, лучше потратить немного больше времени и написать код, более легкий для сопровождения.

Так вроде правильно.
QRegExp rx("^(\\d+\\s?)+$");
Записан
Waryable
Гость
« Ответ #7 : Ноябрь 27, 2010, 10:50 »

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

Так вроде правильно.
QRegExp rx("^(\\d+\\s?)+$");
На мой сугубо личный взгляд код, приведенный Igors, гораздо более легок для сопровождения, т.к. довольно компактен и использует простые конструкции. С другой стороны, использование QRegExp предполагает задание одной строкой аналогичного алгоритма. Это требует знаний всех правил составления этой строки, а так же некоторой отладки(тестирования). Согласись, если бы работа с этим классом была достаточно тривиальна, ты бы не обратился за помощью на форум.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.258 секунд. Запросов: 23.