diff options
-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()); { |