MFC 程序使用错误的小数点分隔符/语言

发布于 2024-10-19 02:08:43 字数 442 浏览 6 评论 0原文

我在 Windows 区域设置(葡萄牙语)中使用逗号作为小数点分隔符,并且我开发的所有程序在格式化字符串或使用 atof 时都使用逗号。

然而,无论我的区域设置如何,我手中的这个特定程序都坚持使用点作为小数点分隔符。

我没有在程序中的任何地方调用 setlocale 或任何其他语言更改函数 AFAIK。事实上,我将这些代码行放在 InitInstance() 函数的最开头:

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

在此程序中产生 4.0000004,870000在所有其他的。

我认为项目的属性中一定有一些错误的设置,但我不知道它是什么。有人可以帮忙吗?

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 formatting 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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

半衬遮猫 2024-10-26 02:08:43

我没有在程序中的任何地方调用 setlocale 或任何其他语言更改函数 AFAIK。

这就是原因。 C 和 C++ 默认为“C”语言环境。尝试将区域设置设置为“”:setlocale(LC_ALL,"");

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,"");

我纯我任性 2024-10-26 02:08:43

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 对应),恕我直言,这是一个更好的选择,因为它会让您知道是否发生了错误。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文