Qt Зачем использовать QString::number() вместо QLocale(). ToString()?

Приложение, над которым я работаю, будет запущено во многих странах и должно поддерживать их язык. Я возвращался к своему коду и заменял каждый экземпляр:

QString::number() а также QString().toDouble()

с

QLocale().toString() а также QLocale().toDouble()

Я не нашел много онлайн сравнения этих двух классов, но меня интересуют последствия использования последних, и если их нет - зачем вообще использовать QString функции?

По сути, я просто хочу убедиться, что я не навредил своему коду перед тем, как вносить все эти изменения. У кого-нибудь есть знания?

1 ответ

Решение

QString методы не зависят от локали: они всегда происходят в C локали. Это полезно, когда ввод / вывод не локализован, например, в файлах данных, которые должны быть переносимы между локалями и / или машиночитаемыми.

Вы определенно не должны случайно заменять каждое использование QString методы с локализованными аналогами из QLocale! Вам необходимо определить, какие виды использования должны быть локализованы: обычно они включают пользовательский интерфейс и, возможно, некоторые операции ввода-вывода в текстовом файле, где в спецификации проекта указано, что числовой ввод-вывод должен быть локализован. Если в спецификации об этом не упоминается, стоит сначала изменить спецификацию, а также задокументировать поведение в пользовательской документации.

Следующие соображения применимы к текстовому вводу / выводу.

  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);
    }
    

    В реальном коде вы хотели бы исследовать все числа не изолированно, а как набор и убедиться, что вы можете обнаружить однозначный выбор для разделителя группы и десятичной точки, иначе вам придется отклонить ввод.

Другие вопросы по тегам