Сбой Qt QString toInt()

#c #qstring

#c #qstring

Вопрос:

У меня есть ‘QString’, содержащий «-3.5», однако, если я попытаюсь преобразовать это в целое число, используя метод ‘toInt’, он возвращает 0. Почему?

     QString strTest = "-3.5";
    int intTest = strTest.toInt();

    qDebug() << intTest;
  

intТест будет равен 0?

Ответ №1:

В отличие std::stoi от потоков и из стандартной библиотеки, строки Qt требуют, чтобы вся строка была допустимым целым числом для выполнения преобразования. Вы могли бы использовать toDouble вместо этого в качестве обходного пути.

Вы также должны использовать необязательный ok параметр для проверки на наличие ошибок:

 QString strTest = "-3.5";
book ok;
int intTest = strTest.toInt(amp;ok);
if(ok) {
    qDebug() << intTest;
} else {
    qDebug() << "failed to read the string";
}
  

Комментарии:

1. Но это допустимое целое число, целое число со знаком равно от -32767 до 32768.

2. Нет. Это действительное число с плавающей запятой / вещественное число. Целое число имеет дискретное значение.

3. хорошо, я это вижу, но я бы ожидал, что он усечет результат и вернет -3.

4. И это то, что стандартные потоки и std::stoi делают. Но, по-видимому, не QString.

Ответ №2:

Если вы посмотрите на документацию, там написано

Возвращает 0, если преобразование завершается с ошибкой.

Вы должны использовать

 bool ok;
strTest.toInt(amp;ok);
  

а затем проверьте значение ok — в противном случае вы не будете уверены, является ли 0 фактическим значением или признаком сбоя.

В этом случае это сбой, потому что на самом деле это не целое число (оно имеет десятичную точку). Обратите внимание, что вы можете использовать toDouble (и проверить ok там тоже!), А затем привести результат по своему усмотрению.

 QString strTest = "-3.5";

bool ok;
double t = strTest.toDouble(amp;ok);

if(ok)
    qDebug() << static_cast<int>(t);