Программа 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
аналог), который, по моему мнению, является лучшим вариантом, потому что он даст вам знать, если что-то случилось.