Qt - пользовательский десятичный разделитель и разделитель тысяч - PullRequest
11 голосов
/ 18 февраля 2011

Как я могу преобразовать число (двойное) в строку с пользовательской десятичной точкой и тысячами символов разделителя?

Я видел QLocale, но я не хочу выбирать страну локализации, а скорееукажите мою собственную десятичную точку и тысячу разделительных символов.

Спасибо

Ответы [ 6 ]

12 голосов
/ 20 февраля 2011

Qt не поддерживает пользовательскую локаль. Но иметь дело только с символами группы и десятичной точки тривиально:

const QLocale & cLocale = QLocale::c();
QString ss = cLocale.toString(yourDoubleNumber, 'f');
ss.replace(cLocale.groupSeparator(), yourGroupChar);
ss.replace(cLocale.decimalPoint(), yourDecimalPointChar);

Кстати, вопрос spbots не имеет значения. Более подробная информация о цели всегда помогает, и это может привести к другому подходу, который может помочь вам лучше

4 голосов
/ 20 февраля 2011

Вот как вы это делаете, просто используя std :: lib (без QT).Определите свой собственный класс, производный от numpunct, который может указывать десятичную точку, символ группировки и даже интервал между группировками.Наполните поток ostring потоком, содержащим ваш аспект.Установите флаги на этом ostringstream по желанию.Выведите его и получите из него строку.

#include <locale>
#include <sstream>
#include <iostream>

class my_punct
    : public std::numpunct<char>
{
protected:
    virtual char do_decimal_point() const {return ',';}
    virtual char do_thousands_sep() const {return '.';}
    virtual std::string do_grouping() const  {return std::string("\2\3");}
};

int main()
{
    std::ostringstream os;
    os.imbue(std::locale(os.getloc(), new my_punct));
    os.precision(2);
    fixed(os);
    double x = 123456789.12;
    os << x;
    std::string s = os.str();
    std::cout << s << '\n';
}

1.234.567.89,12

3 голосов
/ 21 декабря 2018

Самый простой способ - использовать аргумент QString.

QString str = QString("%L1").arg(yourDouble);
2 голосов
/ 04 июля 2016

для пользователей qml:

function thousandSeparator(input){
    return input.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
}
0 голосов
/ 18 февраля 2011

довольно ужасно, но выполнил работу

double doubleNumber = 5234556.3545;
int precision = 2;

QString stringNumber = QString::number(doubleNumber, 'f', precision);

for(int point = 0, i = (stringNumber.lastIndexOf('.') == -1 ? stringNumber.length() : stringNumber.lastIndexOf('.')); i > 0; --i, ++point)
{
    if(point != 0 && point % 3 == 0)
    {
        stringNumber.insert(i, ',');
    }
}
0 голосов
/ 18 февраля 2011

Поскольку вы не хотите использовать QLocale, возможно, вы могли бы выполнить простое преобразование (например, с помощью QString :: number) и затем заменить нужные символы.

...