Qt - 自定义小数点和千位分隔符

时间:2011-02-17 22:14:44

标签: c++ qt localization qt4

如何将数字(double)转换为字符串,使用自定义小数点和千位分隔符字符?

我见过QLocale,但我不想选择本地化国家/地区,而是指定我自己的小数点和千位分隔符字符。

由于

6 个答案:

答案 0 :(得分:12)

Qt不支持自定义区域设置。但是处理只是组和小数点字符是微不足道的:

const QLocale & cLocale = QLocale::c();
QString ss = cLocale.toString(yourDoubleNumber, 'f');
ss.replace(cLocale.groupSeparator(), yourGroupChar);
ss.replace(cLocale.decimalPoint(), yourDecimalPointChar);
顺便说一下,斯波茨的问题并非无关紧要。关于目标的更多细节总是有帮助的,它可能导致可能更好地为您服务的不同方法。

答案 1 :(得分:4)

以下是使用std :: lib(无QT)的方法。定义您自己的numpunct派生类,它可以指定小数点,分组字符,甚至分组之间的间距。使用包含facet的语言环境填充ostringstream。根据需要在该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

答案 2 :(得分:3)

最简单的方法是使用QString的arg。

QString str = QString("%L1").arg(yourDouble);

答案 3 :(得分:2)

用于qml用户:

function thousandSeparator(input){
    return input.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
}

答案 4 :(得分:0)

由于您不想要QLocale,也许您可​​以进行简单的转换(例如使用QString :: number),然后替换所需的字符。

答案 5 :(得分:0)

非常可怕,但完成了工作

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