web-dev-qa-db-ja.com

QString:末尾のゼロなしで小数点以下最大2桁の数値

私はこのような部門を持っています:

number / 1000.0

時々それは96.0000000001のような答えを出します、時々部門は期待通りに機能します。

数値を小数点以下2桁までに制限し、末尾にゼロを付けないようにします。

96.5500000001の場合、96.55と表示されます。

96.4000000001の場合96.4と表示されます

このように文字列をフォーマットすることは可能ですか?

私はドキュメントをチェックしました、そしてそれは小数点以下の桁数を指定するための 'f'引数を提供しますが、このようにして後続のゼロは残ります。これは私が試したものです:

QString::number(number / 1000.0, 'f', 2)

しかし、これは96.4000000001-> 96.496.4の代わりに私に与えます

解決策はありますか?このようにフォーマットするにはどうすればよいですか?

16

documentation は、何をすべきかについてかなり明確です:

精度も引数の形式で指定されます。 「e」、「E」、および「f」形式の場合、精度は小数点以下の桁数を表します。 「g」および「G」形式の場合、精度は有効数字の最大数を表します(末尾のゼロは省略されます)。

したがって、「g」または「G」形式のいずれかを使用します。

main.cpp

#include <QString>
#include <QDebug>

int main()
{
    qDebug() << QString::number(96400.0000001 / 1000.0, 'g', 5);
    qDebug() << QString::number(96550.0000001 / 1000.0, 'G', 5);
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

ビルドして実行

qmake && make && ./main

出力

"96.4"
"96.55"
18
lpapp

これはフォーマットされた数値を常に固定(科学的ではない)表記で返し、かなり効率的です:

QString variableFormat(qreal n) { // assumes max precision of 2
    int i = rint(n * 100.0);
    if (i % 100)
        return QString::number(n, 'f', i % 10 ? 2 : 1);
    else
        return QString::number(i / 100);
}
0
jamess