2012-01-04 2 views
3

Я пытаюсь проверить ввод пользователя с помощью функции QString::toDouble(). documentation говорит функция должна использоваться следующим образом:Использование Qstring :: toDouble Для проверки данных

double QString::toDouble (bool * ok = 0) const; 
/* 
    Returns the string converted to a double value. 
    Returns 0.0 if the conversion fails. 
    If a conversion error occurs, *ok is set to false; otherwise *ok is set to true. 
*/ 

Так что я пытался использовать *ok бросить сообщение об ошибке, если его ложь с целью только что позволяет пользователям вводить действительные целые числа и десятичные. Проблема заключается в том, что сообщение всегда возвращает значение даже при вводе слов. Вот мой код до сих пор:

void MainWindow::checkData() 
{   
    bool validate; 
    QString tempStr; 
    tempStr = ui->lineEditValidate->text(); 
    double converted = tempStr.toDouble(&validate); 
    if (validate = false) 
    { 
     QErrorMessage validateError; 
     validateError.showMessage("Input is Invalid"); 
     validateError.exec(); 
    } 
    else 
    { 
     QErrorMessage worksFine; 
     worksFine.showMessage("valid"); 
     worksFine.exec(); 
    } 
} 

У меня есть ощущение, что я не проходящее в validate аргумент правильно, но документация не достаточно прочной для меня, чтобы действительно знать; возможно, функция QString::toDouble() преобразует буквы в значения.

Может ли кто-нибудь объяснить, где я ошибся?

+0

Обратите внимание, что «ok» будет истинным, если пользователь вводит «NaN» или «Inf», а double не будет десятичным. Вероятно, вы захотите сделать второй уровень проверки, который гарантирует, что число конечно. – cgmb

ответ

5
if (validate = false) 
     //^problem! this is an assignment 

При том, что вы устанавливаете validate в false систематически и тестирование результат этого присвоения - что false тоже.

Это неверно. Вам нужно:

if (validate == true) { 
     // ^^ comparison here 
    // conversion worked 
} else { 
    // conversion failed 
} 

Это даже больше обычного, чтобы пропустить сравнение для логических тестов:

if (valid) { // do stuff if valid ... 

Или:

if (!valid) { // do stuff if not valid ... 

Ваша переменная будет лучше по имени valid или conversionOk или что-то типа того. Это не действие, и оно не указывает, нуждается ли что-то в проверке, но результат этого действия/проверки.

+3

OH человек! Поговорите о том, чтобы слишком глубоко вникать в проблему. Что ж; что я могу сказать, noobs будут noobs. Спасибо за помощь –

Смежные вопросы