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

pic*_*ips 2 qstring qt tostring type-conversion qlocale

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

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

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

我没有找到很多在线比较两个类,但我感兴趣的是使用后者的影响,如果没有 - 为什么要使用这些QString功能?

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

Rei*_*ica 6

这些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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在实际代码中,您需要检查所有不是孤立的数字,而是作为一个集合,并确保您可以检测到组分隔符和小数点的明确选择,否则您必须拒绝输入.