Программа MFC, использующая неправильный десятичный разделитель / язык

У меня запятая в качестве десятичного разделителя в региональных настройках Windows (на португальском языке), и все разрабатываемые мной программы используют запятую при форматировании строк или использовании atof,

Тем не менее, эта конкретная программа, которая попала в мои руки, настаивает на использовании точки в качестве десятичного разделителя, независимо от моих региональных настроек.

Я не звоню setlocale в любом месте программы или любой другой функции смены языка AFAIK. На самом деле я поместил эти строки кода в самом начале InitInstance() функция:

double var = atof("4,87");
TRACE("%f", fDecimal);

Это дает 4.000000 в этой программе и 4,870000 в каждом другом.

Я полагаю, что в свойствах проекта должны быть некоторые неуместные настройки, но я не знаю, что это такое. Кто-нибудь может помочь?

2 ответа

Решение

Я не вызываю setlocale нигде в программе или любой другой функции смены языка AFAIK.

Вот почему. C и C++ по умолчанию используют локаль "C". Попробуйте установить для локали "": setlocale(LC_ALL,"");

atof полагается на локаль C, когда дело доходит до определения ожидаемого десятичного разделителя. Таким образом, как упомянул другой участник, setlocale(LC_NUMERIC, ""); установит языковой стандарт C на пользовательский языковой стандарт (региональные настройки) для функций, связанных с числом. См. Страницу MSDN для получения дополнительной информации о доступных флагах и названиях локалей.

Для тех, кто не хочет менять ваш язык C, вы можете использовать atof_l вместо стандартного atol и предоставить ему структуру локали, созданную с _create_locale (что за имя).

double _atof_l(const char *str, _locale_t locale);

Есть множество альтернатив. Например, вы могли бы использовать strtod (и его Windows strtod_l аналог), который, по моему мнению, является лучшим вариантом, потому что он даст вам знать, если что-то случилось.

Другие вопросы по тегам