Qt为什么在QLocale()上使用QString::number()。toString()?

Qt为什么在QLocale()上使用QString::number()。toString()?,qt,type-conversion,tostring,qstring,qlocale,Qt,Type Conversion,Tostring,Qstring,Qlocale,我正在开发的应用程序将在许多国家推出,需要支持他们的语言。我回顾了我的代码,并替换了以下每个实例: QString::number()和QString().toDouble() 与 QLocale().toString()和QLocale().toDouble() 我在网上没有找到太多比较这两个类的内容,但我对使用后者的影响感兴趣,如果没有,为什么要使用QString函数 本质上,我只是想在做所有这些更改之前,确保我没有损害我的代码。有人知道吗?这些QString方法与区域设置无关:它们总是发生

我正在开发的应用程序将在许多国家推出,需要支持他们的语言。我回顾了我的代码,并替换了以下每个实例:

QString::number()
QString().toDouble()

QLocale().toString()
QLocale().toDouble()

我在网上没有找到太多比较这两个类的内容,但我对使用后者的影响感兴趣,如果没有,为什么要使用
QString
函数


本质上,我只是想在做所有这些更改之前,确保我没有损害我的代码。有人知道吗?

这些
QString
方法与区域设置无关:它们总是发生在
C
区域设置中。这在I/O未本地化时非常有用,例如,在数据文件中,该文件应可跨地区移植和/或机器可读

您绝对不应该随意地将
QString
方法的每次使用都替换为
QLocale
中的本地化对应方法!您需要确定哪些用途应该本地化:通常这些用途包括UI,可能还有一些文本文件I/O,其中项目规范规定数字I/O应该本地化。如果规范没有提到这一点,那么值得先修改规范,并在面向用户的文档中记录行为

以下注意事项适用于文本I/O

  • 对你接受的东西要宽容,对你输出的东西要保守

  • 供人使用且不用于数据提取的机器可读输出,例如PDF和HTML报告文件,应具有本地化的数字

  • 机器消耗的输出,例如CSV和XML文件,应使用C语言环境

  • 文本输入应该允许选择所需的输入区域设置,并且应该是允许的。例如,在使用CSV时,既不直接在输入上使用
    QString::toDouble
    也不直接在输入上使用
    QLocale::toDouble
    ,而是首先对输入进行预处理以检测区域设置并转换为固定的C区域设置,然后才将其提供给
    QString::toDouble
    。例如

    QPair<double, bool> toDouble(QString in) {
      auto dots = in.count('.');
      auto commas = in.count(',');
      if ((dots > 1 && commas > 1) || (dots == 1 && commas ==1))
        // equivocal input
        return qMakePair(0.0, false);
      if (dots > 1 && commas <=1) {
        // dots are group separators
        in.replace(".", "");
        in.replace(',', '.');
      }
      else if (dots <= 1 && commas > 1) {
        // commas are group separators
        in.replace(",", "");
      }
      else if (commas == 1) {
        // assume commas are decimal points
        in.replace(',', '.');
      }
      bool ok;
      auto dbl = in.toDouble(&ok);
      return qMakePair(dbl, ok);
    }
    
    QPair toDouble(Q串入){
    自动点=英寸计数('.');
    自动逗号=英寸计数(',');
    如果((点>1&&逗号>1)| |(点==1&&逗号==1))
    //模棱两可的输入
    返回qMakePair(0.0,false);
    如果(点>1&&逗号)