diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2016-08-19 12:26:44 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2016-09-16 09:21:47 +0000 |
commit | 54f4ac27a2a27975bb3e59cce946c6a24a1a6e44 (patch) | |
tree | 20dd56bdb0de77719e955110516cceb5fc153cb4 | |
parent | 6c74ce6c356f5ee2a61d280f0aa22325e273693b (diff) |
V4: Use QLocale::IncludeTrailingZeroesAfterDot for number conversion
This permits us to drop the post processing of generated numbers and
the detour through QString::asprintf().
Change-Id: I78bd31788f41a3e351408e19856ba58cf7d798c9
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/qml/jsruntime/qv4numberobject.cpp | 24 | ||||
-rw-r--r-- | tests/auto/qml/qjsengine/tst_qjsengine.cpp | 15 |
2 files changed, 19 insertions, 20 deletions
diff --git a/src/qml/jsruntime/qv4numberobject.cpp b/src/qml/jsruntime/qv4numberobject.cpp index f8e0d8763b..444a4cd6f0 100644 --- a/src/qml/jsruntime/qv4numberobject.cpp +++ b/src/qml/jsruntime/qv4numberobject.cpp @@ -63,7 +63,9 @@ NumberLocale::NumberLocale() : QLocale(QLocale::C), // -128 means shortest string that can accurately represent the number. defaultDoublePrecision(0xffffff80) { - setNumberOptions(QLocale::OmitGroupSeparator | QLocale::OmitLeadingZeroInExponent); + setNumberOptions(QLocale::OmitGroupSeparator | + QLocale::OmitLeadingZeroInExponent | + QLocale::IncludeTrailingZeroesAfterDot); } const NumberLocale *NumberLocale::instance() @@ -291,24 +293,6 @@ ReturnedValue NumberPrototype::method_toPrecision(CallContext *ctx) return ctx->engine()->throwRangeError(error); } - // TODO: Once we get a NumberOption to retain trailing zeroes, replace the code below with: - // QString result = NumberLocale::instance()->toString(v->asDouble(), 'g', precision); - QByteArray format = "%#." + QByteArray::number(precision) + "g"; - QString result = QString::asprintf(format.constData(), v->asDouble()); - if (result.endsWith(QLatin1Char('.'))) { - // This is 'f' notation, not 'e'. - result.chop(1); - } else { - int ePos = result.indexOf(QLatin1Char('e')); - if (ePos != -1) { - Q_ASSERT(ePos + 2 < result.length()); // always '+' or '-', and number, after 'e' - Q_ASSERT(ePos > 0); // 'e' is not the first character - - if (result.at(ePos + 2) == QLatin1Char('0')) // Drop leading zeroes in exponent - result = result.remove(ePos + 2, 1); - if (result.at(ePos - 1) == QLatin1Char('.')) // Drop trailing dots before 'e' - result = result.remove(ePos - 1, 1); - } - } + QString result = NumberLocale::instance()->toString(v->asDouble(), 'g', precision); return scope.engine->newString(result)->asReturnedValue(); } diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp index 7163fd8cff..f4eb17f1ca 100644 --- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp +++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp @@ -2142,12 +2142,27 @@ void tst_QJSEngine::jsNumberClass() QJSValue ret = eng.evaluate("new Number(123).toExponential()"); QVERIFY(ret.isString()); QCOMPARE(ret.toString(), QString::fromLatin1("1.23e+2")); + ret = eng.evaluate("new Number(123).toExponential(1)"); + QVERIFY(ret.isString()); + QCOMPARE(ret.toString(), QString::fromLatin1("1.2e+2")); + ret = eng.evaluate("new Number(123).toExponential(2)"); + QVERIFY(ret.isString()); + QCOMPARE(ret.toString(), QString::fromLatin1("1.23e+2")); + ret = eng.evaluate("new Number(123).toExponential(3)"); + QVERIFY(ret.isString()); + QCOMPARE(ret.toString(), QString::fromLatin1("1.230e+2")); } QVERIFY(proto.property("toFixed").isCallable()); { QJSValue ret = eng.evaluate("new Number(123).toFixed()"); QVERIFY(ret.isString()); QCOMPARE(ret.toString(), QString::fromLatin1("123")); + ret = eng.evaluate("new Number(123).toFixed(1)"); + QVERIFY(ret.isString()); + QCOMPARE(ret.toString(), QString::fromLatin1("123.0")); + ret = eng.evaluate("new Number(123).toFixed(2)"); + QVERIFY(ret.isString()); + QCOMPARE(ret.toString(), QString::fromLatin1("123.00")); } QVERIFY(proto.property("toPrecision").isCallable()); { |