开发者

mfc program using wrong decimal separator/language

I have the comma as the decimal separator in my Windows regional settings (Portuguese language), and all the programs I develop use the comma when formatti开发者_运维问答ng strings or using atof.

However, this particular program that came into my hands insists on using the dot as the decimal separator, regardless of my regional settings.

I'm not calling setlocale anywhere in the program or any other language changing function AFAIK. In fact I put these lines of code at the very beginning of the InitInstance() function:

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

This yields 4.000000 in this program and 4,870000 in every other one.

I figure there must be some misplaced setting in the project's properties, but I don't know what it is. Anyone can help?


I'm not calling setlocale anywhere in the program or any other language changing function AFAIK.

That'd be why. C and C++ default to the "C" locale. Try setting the locale to "": setlocale(LC_ALL,"");


atof is relying on the C locale when it comes to determining the expected decimal separator. Thus, as another member mentioned, setlocale(LC_NUMERIC, ""); will set the C locale to the user locale (regional settings) for number-related functions. See MSDN page for more informations on the available flags and the locale names.

For those who don't want to change your C locale, you can use atof_l instead of the standard atol and provide it a locale structure created with _create_locale (what a name).

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

There are a multitude of alternatives. For example you could use strtod (and its Windows strtod_l counterpart) which is IMHO a better option because it will let you know if something wrong happened.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜