Qt Зачем использовать QString::number() вместо QLocale(). ToString()?
Приложение, над которым я работаю, будет запущено во многих странах и должно поддерживать их язык. Я возвращался к своему коду и заменял каждый экземпляр:
QString::number()
а также QString().toDouble()
с
QLocale().toString()
а также QLocale().toDouble()
Я не нашел много онлайн сравнения этих двух классов, но меня интересуют последствия использования последних, и если их нет - зачем вообще использовать QString
функции?
По сути, я просто хочу убедиться, что я не навредил своему коду перед тем, как вносить все эти изменения. У кого-нибудь есть знания?
1 ответ
QString
методы не зависят от локали: они всегда происходят в C
локали. Это полезно, когда ввод / вывод не локализован, например, в файлах данных, которые должны быть переносимы между локалями и / или машиночитаемыми.
Вы определенно не должны случайно заменять каждое использование QString
методы с локализованными аналогами из QLocale
! Вам необходимо определить, какие виды использования должны быть локализованы: обычно они включают пользовательский интерфейс и, возможно, некоторые операции ввода-вывода в текстовом файле, где в спецификации проекта указано, что числовой ввод-вывод должен быть локализован. Если в спецификации об этом не упоминается, стоит сначала изменить спецификацию, а также задокументировать поведение в пользовательской документации.
Следующие соображения применимы к текстовому вводу / выводу.
Будьте терпимы к тому, что вы принимаете, и консервативны в том, что вы выводите.
Вывод, предназначенный для потребления человеком и не предназначенный для считывания с компьютера для извлечения данных, например, файлы отчетов 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); }
В реальном коде вы хотели бы исследовать все числа не изолированно, а как набор и убедиться, что вы можете обнаружить однозначный выбор для разделителя группы и десятичной точки, иначе вам придется отклонить ввод.