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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: точка, точка, запятая... разные вещественные форматы Lin/Win (SOLVED)  (Прочитано 4746 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Февраль 01, 2011, 12:41 »

Честно говоря, не совсем понятно, где об этом стоит посоветоваться, решил лучше здесь. Формат вещественных - это вроде как тоже "локализация". Проблема скорее всего не чисто Qt, очевидно stdlib, однако она возникла при переносе Qt-приложения, здесь наверняка больше опытных в этом людей, значит здесь больше вероятность найти правильное решение.

Некая библиотека была написана на С (!++), изначально (достаточно давно) и разрабатывалась в Linux Debian, потом перенесена в WinXP, сейчас обратно. Приложение использует эту библиотеку, отлаживаю его в Kubuntu 10.10 уже с использованием Qt. Обнаружил такой неожиданный эффект - перестали распознаваться вещественные числа. И формироваться соответственно тоже. Для преобразований в библиотеке используются давно отлаженные нижние функции, они вызывают sptintf() и atof(). Раньше все работало, в Debian без фокусов все преобразовывалось туда-сюда. В Windows тоже проблем не возникало. Разделитель целой и дробной частей - точка, функции из стандартных библиотек ее всегда понимали. Причем, в Windows не зависимо от того, какая локализация и формат вещественных установлен в системе. В Debian локализация была русская, разделители по-умолчанию (наверно, сейчас уже не проверить). В Kubuntu сейчас тоже русская локализация, в системной локали специально установлен разделитель "точка". Но функции stdlib почему-то лепят и понимают... запятую.

И че-то пока как-то не понятно, что с этим делать... Использовать какие-то другие библиотечные функции нельзя - нижний уровень опирается только на стандартные библиотечные средства, это идеологически обоснованно, поскольку библиотека используется в разных проектах, на разных платформах. Можно, конечно, накатать собственные ftoa и atof, хотя это не так тривиально, как может показаться (когда-то очень давно писал ftoa, c тех пор решил, что лучше буду всегда пользоваться библиотечными).

Или это баг сборки конкретной stdlib/stdio? В Win сборка и отладка производятся с использованием mingw, а не MS библиотек. И с mingw все работает правильно! Может кто-нибудь сказать, что происходит в разных версиях Linux? Почему системная локаль не влияет на формат вещественных чисел в стандартной библиотеке?
« Последнее редактирование: Февраль 01, 2011, 16:08 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #1 : Февраль 01, 2011, 16:07 »

тфу блин, locale/setlocale... я уже и забыл про них давно...

да, setlocale( LC_NUMERIC, "C" );

вылечило, стала использоваться точка

но это странно, поскольку в системной локали точно указана точка, а по умолчанию в приложении localeconv()->decimal_point содержит ",", и все поля настроены на русский, как если бы приложение использовало не системную локаль

не может ли Qt устанавливать локаль приложения по-своему? может при инициализации Qt правильнее сказать, чтобы он ставил системную локаль? я с этим в Qt еще не полностью разобрался, подскажите, кто знает хорошо
« Последнее редактирование: Февраль 01, 2011, 16:37 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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