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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Oracle Разделитель целой и дробной части  (Прочитано 11561 раз)
pokidoff
Гость
« : Май 19, 2011, 10:14 »

В базе хранятся вещественные числа. В системных настройках разделитель точка. При выборке из базы столбцы с вещественными числами имеют тип QVariant::String и имеют в качестве разделителя запятую. Что нужно сделать, чтобы выборка шла в соответствии с локалью?


Oracle 11.2, Qt 4.7.0, WinXP Pro
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 19, 2011, 10:42 »

Цитировать
При выборке из базы столбцы с вещественными числами имеют тип QVariant::String
А почему не QVariant::Double?
Цитировать
Что нужно сделать, чтобы выборка шла в соответствии с локалью?
Так с локалью или с настройками оракла?
Записан

Qt 5.11/4.8.7 (X11/Win)
pokidoff
Гость
« Ответ #2 : Май 19, 2011, 10:50 »

Цитировать
Цитировать
При выборке из базы столбцы с вещественными числами имеют тип QVariant::String
А почему не QVariant::Double?
Я и сам хотел бы это знать. Скорее всего из-за запятой, т.к. невозможно перевести в double
Цитировать
Цитировать
Что нужно сделать, чтобы выборка шла в соответствии с локалью?
Так с локалью или с настройками оракла?
Хоть с чем-нибудь.
Записан
pokidoff
Гость
« Ответ #3 : Май 19, 2011, 11:00 »

Решил
Код
C++ (Qt)
query.exec("ALTER SESSION SET NLS_NUMERIC_CHARACTERS = \".,\"");
Записан
MoPDoBoPoT
Гость
« Ответ #4 : Май 19, 2011, 22:53 »

Цитировать
Цитировать
При выборке из базы столбцы с вещественными числами имеют тип QVariant::String
А почему не QVariant::Double?
Я и сам хотел бы это знать. Скорее всего из-за запятой, т.к. невозможно перевести в double
Потому что в БД могут храниться числа с большей точностью. Читать про QSql::NumericalPrecisionPolicy
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Май 20, 2011, 09:44 »

Цитировать
Потому что в БД могут храниться числа с большей точностью. Читать про QSql::NumericalPrecisionPolicy
А могут и не храниться. И что значит все числа будем хранить как строки? Бред...

PS: упс, погорячился, упустил что 'QSql::HighPrecision - The default behavior'.
« Последнее редактирование: Май 20, 2011, 10:17 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
pokidoff
Гость
« Ответ #6 : Май 20, 2011, 10:01 »

У меня в проге стоит
Код
C++ (Qt)
db.setNumericalPrecisionPolicy(QSql::HighPrecision);
И все равно колонки типа NUMBER(5,2) в QT попадают как QVariant:String

А вот пример, работающий при любых системных настройках
Код
C++ (Qt)
   QSqlQuery query(db);
   QChar delimiter = QLocale::system().decimalPoint();
   QString qs = "ALTER SESSION SET NLS_NUMERIC_CHARACTERS = \"%1\"";
   qs = (delimiter == '.' ? qs.arg(".,") : qs.arg(",."));
   query.exec(qs);
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Май 20, 2011, 10:06 »

У меня в проге стоит
Код
C++ (Qt)
db.setNumericalPrecisionPolicy(QSql::HighPrecision);
И все равно колонки типа NUMBER(5,2) в QT попадают как QVariant:String
Ну и зачем тогда тебе HighPrecision? Используй QSql::LowPrecisionDouble для таких чисел.
Записан

Qt 5.11/4.8.7 (X11/Win)
pokidoff
Гость
« Ответ #8 : Май 20, 2011, 15:26 »

Код:
The default behavior is to bind these values as a QString.
QSql::HighPrecision The default behavior - try to preserve maximum precision.
Да, тупанул. Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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