我获得了一个XML,用于定义表格中的单元格格式,例如:
%.2f
%d.%m.%Y %R
现在我想在某个数字(或日期)上使用该格式来生成格式化的数字行:
Before After
12.54893 => 12.54
我试过这个数字。 formating
是包含%.2f
格式的QString。值QVariant
保证为数字。
formating.toString().arg(value.toLongLong());
但结果相当糟糕:
所以我想我需要一个不同的QString
方法。这是我旧的,过时的 std::
方法,必须删除:
QByteArray FSA = formater.toString().toLatin1();
const char* fs = FSA.data();
// See locale pseudo-singleton below
boost::format f( fs, STDLocaleSingleton::Instance() );
return QString::fromLatin1( boost::str( f % value->getLongValue() ).c_str() );
// Probably saves some memory, I think
class STDLocaleSingleton {
STDLocaleSingleton(){};
public:
static const std::locale &Instance(){
static std::locale loc("");
return loc;
}
};
答案 0 :(得分:1)
我的建议是使用QString::number()方法。
您需要做的是从格式中提取格式信息,但正则表达式应该足够好。
QString format("%.2f");
int precision;
double before = 12.54893;
QRegularExpression regexp("\\%\\.(\\d+)f");
QRegularExpressionMatch match = regexp.match(format);
if(match.hasMatch() == true) {
precision = match.captured(1).toInt();
qDebug() << "Precision: " << precision;
QString after = QString::number(before, 'f', precision);
qDebug() << "Before: " << before;
qDebug().noquote() << "After : " << after;
} else {
qDebug() << "No match";
}
我看到输出有点圆,但如果这是一个问题,你将不得不做其他事情:
Precision: 2
Before: 12.5489
After : 12.55