LINUX.ORG.RU

Конвертация QVariant в double в Qt 4.8.7

 , ,


0

1

Поставил из репы Qt 4.8.7. Из БД получаю число 1.8e+000, которое хранится там в типе varchar. Далее пытаюсь сконвертировать его в double:

double d = query.value(0).toDouble();
и получаю, что
d = 0
Внутри QVariant тип определяется правильно как QString. Проверял на другой машине с Qt 4.8.6, там все нормально.


Сделай пример, демонстрирующий такое поведение, чтобы можно было проверить.

Если это баг в Qt, то нужно писать в багтрекер. Вот только Qt 4.8.7 это последняя версия Qt 4 и обновлений там больше не будет, нужно переходить на Qt 5.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Вот такой код в Qt 4.8.7 выдает неверный результат:

#include <QCoreApplication>
#include <QSqlQuery>
#include <QSqlDatabase>
#include <QVariant>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase( "QPSQL", "creditdb" );
    db.setHostName( "127.0.0.1" );
    db.setDatabaseName( "creditdb" );
    db.setUserName( "test" );
    db.setPassword( "testpassw" );

    db.open();

    QSqlQuery query;
    query.exec( "select kr.procent from public.kredit kr where kr.id = 100" );
    query.next();

    double dProcent = query.value(0).toDouble();

    qDebug() << dProcent;

    return a.exec();
}

В БД procent хранится в столбце character varying(10).

В примере специально не делал проверки на открытие БД и т.п., в реальном коде это все есть.

нужно переходить на Qt 5

Увы, это задание нужно в именно в Qt4 сделать.

asaks
() автор топика
Ответ на: комментарий от asaks

Проверь ещё, чтобы перед числом не было пробелов или каких других символов

XMs ★★★★★
()
Ответ на: комментарий от asaks

Как вариант:
Не помню какой метод QString это делает, но замени . на , в том, что получил, а потом сделай toDouble.

PPP328 ★★★★★
()

Из БД получаю число 1.8e+000, которое хранится там в типе varchar

this

anonymous
()
Ответ на: комментарий от asaks

Локаль вроде бы везде одинаковая - ru_RU, но завтра проверю на всякий случай.

В ru_RU должна быть запятая, а не точка: «1,8e+000».

Beewek ★★
()
Ответ на: комментарий от Beewek

При вызове QLocale:system() в поле decimalPoint указана точка. Использую Linux Mint 18.3.

asaks
() автор топика
QString s = query.value(0).toString();
qDebug() << s;
double d = s.toDouble();

что пишет на обоих машинах?

next_time ★★★★★
()
Последнее исправление: next_time (всего исправлений: 1)

Правильным решением было бы сконвертировать на стороне БД, если не в таблице, то хотя бы при выборке.

unC0Rr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.