以printf方式创建QString而不使用std和std :: strings

时间:2015-10-19 14:44:15

标签: c++ qt5

我获得了一个XML,用于定义表格中的单元格格式,例如:

%.2f
%d.%m.%Y %R

现在我想在某个数字(或日期)上使用该格式来生成格式化的数字行:

Before           After
12.54893    =>   12.54

我试过这个数字。 formating是包含%.2f格式的QString。值QVariant保证为数字。

formating.toString().arg(value.toLongLong());

但结果相当糟糕:

image description

所以我想我需要一个不同的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;
    }
};

1 个答案:

答案 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