2

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

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

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

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

本质上,我只是想确保在进行所有这些更改之前不会损害我的代码。有没有人有任何知识?

4

1 回答 1

7

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

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

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

  1. 对你接受的东西宽容,对你输出的东西保守。

  2. 供人类消费的输出,而不是用于数据提取的机器可读的输出,例如 PDF 和 HTML 报告文件,应该有本地化的数字。

  3. 供机器使用的输出,例如 CSV 和 XML 文件,应使用 C 语言环境。

  4. 文本输入应该允许选择所需的输入语言环境,并且应该是允许的。例如,在使用 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);
    }
    

    在实际代码中,您希望检查所有数字,而不是孤立地检查所有数字,并确保您可以检测到组分隔符和小数点的明确选择,否则您将不得不拒绝输入。

于 2016-06-28T21:04:48.067 回答