2016-06-28 7 views
2

Приложение, над которым я работаю, будет запущено во многих странах и должно поддерживать их язык. Я шел обратно через мой код и заменить каждый экземпляр:Qt Зачем использовать QString :: number() над QLocale(). ToString()?

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

с

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

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

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

ответ

5

Методы 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); 
    } 
    

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