aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2015-01-28 09:34:10 +0100
committerErik Verbruggen <erik.verbruggen@theqtcompany.com>2015-03-03 10:04:31 +0000
commitc3effc6cd3a66b6c02048d8ad85c7ed3bb3c1463 (patch)
tree0f3a90e0350de5243e0fb43ec0d7994cc18cc77a
parent29bb4495e6b827bd8dd443ce07cb7ccda14645c1 (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.cpp12
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp13
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"