#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);