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

12

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

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

谢谢


我不禁要问 - 为什么需要使用自定义分隔符?你是在解析列表并被迫使用小数点(或句点)作为分隔符吗? - spbots
1
由于这是一个数学应用程序,客户希望提供选项来指定自定义小数点和千位分隔符字符。为什么会有这些无关紧要的问题呢... - Stari As
6个回答

14

Qt 不支持自定义地域设置。但只处理分组和小数点字符是很简单的:

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

顺便说一句, spbots 的问题并不无关紧要。提供更多有关目标的详细信息总是有帮助的,可能会引导您采取不同的方法,从而使您获得更好的结果。


5

使用std::lib(没有QT),以下是如何实现。定义自己的numpunct派生类,可以指定小数点、分组字符,甚至可以指定分组之间的间距。将一个ostringstream与包含您facet的locale相结合。根据需要设置该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


对于基于Unicode的千位分隔符,例如窄无间隔空格U+202F,您可以使用 std::basic_stringstream<wchar_t>std::numpunct<wchar_t>std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t>。示例代码 在这里 - Ruslan

4
最简单的方法是使用QString的arg函数。
QString str = QString("%L1").arg(yourDouble);

3

对于 QML 用户:

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

尽管这段代码可能有助于解决问题,但提供关于为什么和/或如何回答问题的额外上下文将显著提高其长期价值。请编辑您的答案以添加一些解释。 - Toby Speight
答案对我来说非常合适。谢谢! - rsp1984

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接