如何将数字(double)转换为字符串,并带有自定义的小数点和千位分隔符?
我看到过 QLocale,但我不想选择本地化国家,而是指定自己的小数点和千位分隔符字符。
谢谢
如何将数字(double)转换为字符串,并带有自定义的小数点和千位分隔符?
我看到过 QLocale,但我不想选择本地化国家,而是指定自己的小数点和千位分隔符字符。
谢谢
Qt 不支持自定义地域设置。但只处理分组和小数点字符是很简单的:
const QLocale & cLocale = QLocale::c();
QString ss = cLocale.toString(yourDoubleNumber, 'f');
ss.replace(cLocale.groupSeparator(), yourGroupChar);
ss.replace(cLocale.decimalPoint(), yourDecimalPointChar);
顺便说一句, spbots 的问题并不无关紧要。提供更多有关目标的详细信息总是有帮助的,可能会引导您采取不同的方法,从而使您获得更好的结果。
使用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
std::basic_stringstream<wchar_t>
、std::numpunct<wchar_t>
和 std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t>
。示例代码 在这里。 - RuslanQString str = QString("%L1").arg(yourDouble);
对于 QML 用户:
function thousandSeparator(input){
return input.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
}
看起来很糟糕,但完成了工作
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, ',');
}
}
既然您不想使用QLocale,也许您可以进行简单的转换(例如使用QString::number),然后再替换所需的字符。