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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с локализацией вещественных чисел в QVariant  (Прочитано 3841 раз)
vi7
Гость
« : Ноябрь 15, 2014, 19:05 »

Всем доброго времени.

Подскажите, как правильно «локализировать» QVariant.
Суть проблемы в том, что в QT5 (в QT4 этой проблемы не было) QVariant «не правильно» преобразует вещественные числа в строки и наоборот – в качестве разделителя всегда используется точка, а мне нужно, чтобы была запятая. Это происходит из-за того, что в функции преобразования (QVariant ::convert) написано следующее:

Код:
...
         case QMetaType::Float:
            *str = QString::number(d->data.f, 'g', FLT_DIG);
            break;
        case QVariant::Double:
            *str = QString::number(d->data.d, 'g', DBL_DIG);
            break;
...

а это значит, что используется QString::number, которая всегда преобразует числа используя точку в качестве разделителя. Аналогично и с обратным преобразованием.
Сейчас, для того, чтобы решить эту проблему, мне приходится в каждом месте, где возможно такое преобразование писать что-то вроде:

Код:
         QVariant var_data;

         ...

         QString str_data;
         if (var_data.type() == QVariant::Double)
           str_data = QLocale().toString(var_data.toDouble());
         else
           str_data = var_data.toString();

А как по правильному сделать, чтобы QVariant выполнял подобные преобразования автоматически?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Ноябрь 15, 2014, 19:11 »

А как по правильному сделать, чтобы QVariant выполнял подобные преобразования автоматически?
Сделайте свою функцию my_to_string, которая будет делать как надо и используйте ее.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Ноябрь 15, 2014, 23:32 »

или установите нужную локаль через QLocale::setLocale().
Мне наоборот, нужно было что бы вещ числа писались через точку, т.к. файлы сохранялись под разными ОС, то я в своей программе установил QLocale::setLocale(QLocale::c());
Записан
vi7
Гость
« Ответ #3 : Ноябрь 16, 2014, 00:24 »

Сделайте свою функцию my_to_string, которая будет делать как надо и используйте ее.

я так и сделал. Но беда в том, что эти функции нужно вызывать в каждом месте, где происходит переприсвоение QVariant! Т.е. при переносе программы из QT4 на QT5 пришлось кучу дурной работы делать...

или установите нужную локаль через QLocale::setLocale().
Мне наоборот, нужно было что бы вещ числа писались через точку, т.к. файлы сохранялись под разными ОС, то я в своей программе установил QLocale::setLocale(QLocale::c());

Увы, QLocale::setLocale() не действует на QString::number, которая как раз и используется внутри кода QVariant!  В документации сказано:
Цитировать
The formatting always uses QLocale::C, i.e., English/UnitedStates. To get a localized string representation of a number, use QLocale::toString() with the appropriate locale.
...
Unlike QLocale::toString(), this function does not honor the user's locale settings.

Так что, можно и не делать QLocale::setLocale(): там где требуется работа с пользователем использовать QLocale::toString(), а где нужна точка - QString::number. Только, увы, моей проблемы это не решает...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Ноябрь 16, 2014, 15:25 »

Я не понял, в чем проблема использовать всегда QLocale для преобразования в строку и обратно?
ИМХО, это даже будет выгодней, т.к. это только-лишь формат отображения информации, и для "россиян" принято
через запятую все шваркать.. Таким образом, если вдруг программа будет распространяться иноземцам, то тут
также не будет проблем, и не надо будет ничего лепить, т.к. QLocale автоматом подстроится под локаль..
Ну, или на крайний случай можно сделать настройку в программе где дать пользователю возможность выбора
предпочтительного формата данных..
Записан

ArchLinux x86_64 / Win10 64 bit
vi7
Гость
« Ответ #5 : Ноябрь 16, 2014, 16:26 »

Я не понял, в чем проблема использовать всегда QLocale для преобразования в строку и обратно?

Я так и поступаю, а вот тот, кто писал QVariant для QT5 поступил по-другому (зачем?). И суть моего вопроса - как это исправить? Изучив исходники QVariant я не понял, как это правильно сделать... Просто интересно - эта "особенность" тянется с самой первой версии QT5 и неужели, никто из "россиян" не работает с QVariant и не решил эту проблему?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Ноябрь 16, 2014, 16:51 »

Цитировать
QVariant для QT5 поступил по-другому (зачем?).

Я хз, спроси у них в рассылке, запости баг. Улыбающийся

Цитировать
Изучив исходники QVariant я не понял, как это правильно сделать... Просто интересно - эта "особенность" тянется с самой первой версии QT5 и неужели, никто из "россиян" не работает с QVariant и не решил эту проблему?

А никакой ошибки и нет, все резонно. Скорее всего они просто забыли упомянуть об этом в документации на QVariant
или не стали этого делать. Поэтому, т.к. нигде в доке (на Qt4/Qt5) не сказано что QVariant должен возвратить локализованную
строку, то и не нужно было на это полагаться. Не факт, что если это работало на Qt4 то это будет работать на Qt5.
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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