【问题标题】:const char* to double translation issue with C++const char* 到 C++ 的双重翻译问题
【发布时间】:2016-02-09 14:51:08
【问题描述】:

我有两个使用相同库的示例应用程序,它们之间的主要区别在于一个使用 qt 而另一个应用程序是控制台应用程序。

在公共库中,我有这个测试代码:

double test = 0.1;
double test2 = atof("2.13134");
double test3 = atof("1,12345");

如果我使用非 qt 应用程序的值是:

test = 0.10000000000001
test2 = 2.1323399999999999998
test3 = 1   // This is the expected result using a ',' as delimitation character

但是使用 qt 应用程序:

test = 0.10000000000001
test2 = 2     // This is not expected!!!
test3 = 1.1234500000000000001

在任何情况下,'atof' 的行为会因为 qt 而发生变化吗?

【问题讨论】:

  • Qt 使用代码预处理,这可能会做不好的事情。或者可能有一些宏在起作用。
  • @Cheersandhth.-Alf 这看起来更像是一个语言环境问题(请记住,, 在许多语言环境中是小数点字符)——也许 Qt 正在根据系统设置设置一个非默认语言环境?
  • 对于来自德国的人来说,Qt 应用程序是正确的。
  • 这里的主要问题是,为什么小数点字符不同。因为我不是故意改这个的,而且这段代码根本没有使用qt。
  • @Cheersandhth.-Alf moc 不会修改现有代码,它会为信号/插槽、元对象处理生成附加代码。

标签: c++ qt atof


【解决方案1】:

std::atof 取决于当前设置的语言环境来告诉它哪个字符是小数点。在默认情况下(“C 语言环境”),即句点字符“.”。

Qt 可能正在将语言环境设置为其他内容。您可以使用standard C[++] mechanism 恢复它:

std::setlocale(LC_ALL, "C");

【讨论】:

  • 我已经包含了 'std::setlocale(LC_ALL, "C");'在库中类的构造函数中,它现在正在工作。谢谢!!!
  • @goe:检查具有国际字符的窄字符串文字现在是否正确地作为 Qt 字符串结束可能是个好主意。
【解决方案2】:

您注意到的问题很可能是由 Qt 的语言环境概念引起的。您可以使用:

QLocale::setDefault(QLocale::C);

让它像atof一样工作。

更新

QLocale::setDefault 似乎没有设置 Qt 使用的默认语言环境。它只是设置将在您构造QLocale 时创建的默认语言环境。有关更多信息,请参阅 Changing locale in Qt 和接受的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多