From c3effc6cd3a66b6c02048d8ad85c7ed3bb3c1463 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Wed, 28 Jan 2015 09:34:10 +0100 Subject: 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 --- src/qml/jsruntime/qv4numberobject.cpp | 12 +++++++++--- 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" -- cgit v1.2.3