在Qt5中从std :: stod()和QString :: toDouble()获取不同的值

Shu*_*ush 1 floating-point double qt c++11

我启动了一个Qt项目并将其链接到我编写的一些C++代码来解析文件.此代码使用std :: stod()来解析double值,并且在普通的c ++项目中工作正常,但是当与Qt应用程序一起使用时,std :: stod()仅返回数字的整数部分.

我编写并运行了一些测试代码,一个用g ++ 6.1编译,另一个用qmake 5.6和相同的g ++编写.结果与我的项目结果相同.

用g ++编译的代码:

#include <iostream>

int main(int argc, char ** argv)
{
  const std::string number("3.14");
  double dbl = std::stod(number);

  std::cout << dbl << '\n'; // 3.14

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它显示了良好的价值: 3.14

用Qt编译的代码:

#include <QCoreApplication>
#include <QDebug>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    const std::string snumber("3.14");
    const QString qnumber = QString::fromStdString("3.14");

    double std_d = std::stod(snumber);
    double qt_d  = qnumber.toDouble();

    qDebug() << std_d << qt_d;                 // 3 3.14
    std::cout << std_d << ' ' << qt_d << '\n'; // 3 3.14

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

你能告诉我为什么std :: stod()表现得像这样吗?

pep*_*ppe 6

因为 std::stod 破碎无法修复,应该在地狱中燃烧根据当前的语言环境来std::strtod解释双打的.QString总是使用C语言环境(使用QLocale进行特定于语言环境的转换).

创建QCoreApplication实例会导致调用setlocale(LC_ALL, ""),该调用根据环境设置进程的语言环境,从而改变std::stod行为.