【问题标题】:mfc program using wrong decimal separator/languagemfc 程序使用错误的小数分隔符/语言
【发布时间】:2011-07-02 03:52:37
【问题描述】:

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

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

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

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

这将在此程序中产生4.000000,在其他程序中产生4,870000

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

【问题讨论】:

    标签: c++ mfc decimal-point


    【解决方案1】:

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

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

    【讨论】:

    • 你是对的。结果发现其他程序引用了一个名为setlocale 的DLL。谢谢。
    【解决方案2】:

    atof 在确定预期的小数分隔符时依赖于 C 语言环境。因此,正如另一位成员提到的,setlocale(LC_NUMERIC, ""); 会将 C 语言环境设置为用户语言环境(区域设置),以实现与数字相关的功能。有关可用标志和语言环境名称的更多信息,请参阅MSDN page

    对于那些不想更改 C 语言环境的人,您可以使用 atof_l 代替标准的 atol,并为其提供使用 _create_locale(多么好的名字)创建的语言环境结构。

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

    有多种选择。例如,您可以使用 strtod(及其 Windows strtod_l 对应项),恕我直言,这是一个更好的选择,因为它会让您知道是否发生了错误。

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2012-12-26
      • 2012-02-19
      • 1970-01-01
      • 2022-06-14
      相关资源
      最近更新 更多