diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2015-01-28 09:34:10 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@theqtcompany.com> | 2015-03-03 10:04:31 +0000 |
commit | c3effc6cd3a66b6c02048d8ad85c7ed3bb3c1463 (patch) | |
tree | 0f3a90e0350de5243e0fb43ec0d7994cc18cc77a | |
parent | 29bb4495e6b827bd8dd443ce07cb7ccda14645c1 (diff) |
V4: fix ToFixed rounding for 0 fraction digits.
(12.5).toFixed() should return 13, not 12.
Task-number: QTBUG-43885
Task-number: QTBUG-44039
Change-Id: Id2b19641e8c12dd5755d8447508b74567e4a2b9b
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
-rw-r--r-- | src/qml/jsruntime/qv4numberobject.cpp | 12 | ||||
-rw-r--r-- | tests/auto/qml/qjsengine/tst_qjsengine.cpp | 13 |
2 files changed, 22 insertions, 3 deletions
diff --git a/src/qml/jsruntime/qv4numberobject.cpp b/src/qml/jsruntime/qv4numberobject.cpp index 227ff14104..236091ba68 100644 --- a/src/qml/jsruntime/qv4numberobject.cpp +++ b/src/qml/jsruntime/qv4numberobject.cpp @@ -202,9 +202,15 @@ ReturnedValue NumberPrototype::method_toFixed(CallContext *ctx) str = QString::fromLatin1("NaN"); else if (qIsInf(v)) str = QString::fromLatin1(v < 0 ? "-Infinity" : "Infinity"); - else if (v < 1.e21) - str = QString::number(v, 'f', int (fdigits)); - else + else if (v < 1.e21) { + char buf[100]; + double_conversion::StringBuilder builder(buf, sizeof(buf)); + double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToFixed(v, fdigits, &builder); + str = QString::fromLatin1(builder.Finalize()); + // At some point, the 3rd party double-conversion code should be moved to qtcore. + // When that's done, we can use: +// str = QString::number(v, 'f', int (fdigits)); + } else return RuntimeHelpers::stringFromNumber(ctx, v)->asReturnedValue(); return ctx->d()->engine->newString(str)->asReturnedValue(); } diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp index 158ee1589a..2b7b1fc524 100644 --- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp +++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp @@ -174,6 +174,7 @@ private slots: void privateMethods(); void intConversion_QTBUG43309(); + void toFixed(); signals: void testSignal(); @@ -3615,6 +3616,18 @@ void tst_QJSEngine::intConversion_QTBUG43309() QCOMPARE(result.toNumber(), 25.0); } +// QTBUG-44039 and QTBUG-43885: +void tst_QJSEngine::toFixed() +{ + QJSEngine engine; + QJSValue result = engine.evaluate(QStringLiteral("(12.5).toFixed()")); + QVERIFY(result.isString()); + QCOMPARE(result.toString(), QStringLiteral("13")); + result = engine.evaluate(QStringLiteral("(12.05).toFixed(1)")); + QVERIFY(result.isString()); + QCOMPARE(result.toString(), QStringLiteral("12.1")); +} + QTEST_MAIN(tst_QJSEngine) #include "tst_qjsengine.moc" |