MFC 程序使用错误的小数点分隔符/语言
我在 Windows 区域设置(葡萄牙语)中使用逗号作为小数点分隔符,并且我开发的所有程序在格式化字符串或使用 atof
时都使用逗号。
然而,无论我的区域设置如何,我手中的这个特定程序都坚持使用点作为小数点分隔符。
我没有在程序中的任何地方调用 setlocale
或任何其他语言更改函数 AFAIK。事实上,我将这些代码行放在 InitInstance()
函数的最开头:
double var = atof("4,87");
TRACE("%f", fDecimal);
在此程序中产生 4.000000
和 4,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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我没有在程序中的任何地方调用 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,"");
atof
在确定预期的小数分隔符时依赖于 C 语言环境。因此,正如另一位成员提到的,setlocale(LC_NUMERIC, "");
会将 C 区域设置设置为数字相关函数的用户区域设置(区域设置)。有关可用标志和区域设置名称的详细信息,请参阅 MSDN 页面。对于那些不想更改 C 区域设置的人,可以使用
atof_l
而不是标准的atol
并为其提供使用_create_locale
(多好的名字啊)。有多种选择。例如,您可以使用
strtod
(及其 Windowsstrtod_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 standardatol
and provide it a locale structure created with_create_locale
(what a name).There are a multitude of alternatives. For example you could use
strtod
(and its Windowsstrtod_l
counterpart) which is IMHO a better option because it will let you know if something wrong happened.