программа MFC, использующая неправильный десятичный разделитель / язык - PullRequest
2 голосов
/ 22 февраля 2011

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

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

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

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

Это дает 4.000000 в этой программе и 4,870000 во всех остальных.

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

Ответы [ 2 ]

3 голосов
/ 22 февраля 2011

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

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

1 голос
/ 29 сентября 2013

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 аналог), который ИМХО является лучшим вариантом, потому что он сообщит вам, если что-то случилось.

...