svl/qa/unit/svl.cxx | 35 +++++++++++++++++++++++++++++++++++ svl/source/numbers/zformat.cxx | 11 +++++++++++ 2 files changed, 46 insertions(+)
New commits: commit 5e180078ecc4501900e41da48b279033a7529a96 Author: Eike Rathke <er...@redhat.com> Date: Wed Feb 15 22:05:29 2017 +0100 unit test for engineering notation, tdf#105968 Change-Id: Ib5303f09cfda232b0bee88df3d76650165337c08 diff --git a/svl/qa/unit/svl.cxx b/svl/qa/unit/svl.cxx index 9804c7e..8e185d5 100644 --- a/svl/qa/unit/svl.cxx +++ b/svl/qa/unit/svl.cxx @@ -1221,6 +1221,41 @@ void Test::testUserDefinedNumberFormats() sCode = "[DBNum2][$-0404]General\\ "; checkPreviewString(aFormatter, sCode, 120, eLang, sExpected); } + { // tdf#105968 engineering format with value rounded up to next magnitude + sCode = "##0.00E+00"; + sExpected = "100.00E+00"; + checkPreviewString(aFormatter, sCode, 99.995, eLang, sExpected); + // test '1'=='1' assumption + checkPreviewString(aFormatter, sCode, 100.0, eLang, sExpected); + sExpected = "199.99E+00"; + checkPreviewString(aFormatter, sCode, 199.99, eLang, sExpected); + sExpected = "1.00E+03"; + checkPreviewString(aFormatter, sCode, 1000.0, eLang, sExpected); + // and another just "normally" rounded value + sExpected = "894.55E-06"; + checkPreviewString(aFormatter, sCode, 0.000894549, eLang, sExpected); + // not expecting rounding into another magnitude + sExpected = "999.99E-06"; + checkPreviewString(aFormatter, sCode, 0.000999991, eLang, sExpected); + // expecting rounding into another magnitude + sExpected = "1.00E-03"; + checkPreviewString(aFormatter, sCode, 0.000999999, eLang, sExpected); + + // Now the same all negative values. + sExpected = "-100.00E+00"; + checkPreviewString(aFormatter, sCode, -99.995, eLang, sExpected); + checkPreviewString(aFormatter, sCode, -100.0, eLang, sExpected); + sExpected = "-199.99E+00"; + checkPreviewString(aFormatter, sCode, -199.99, eLang, sExpected); + sExpected = "-1.00E+03"; + checkPreviewString(aFormatter, sCode, -1000.0, eLang, sExpected); + sExpected = "-894.55E-06"; + checkPreviewString(aFormatter, sCode, -0.000894549, eLang, sExpected); + sExpected = "-999.99E-06"; + checkPreviewString(aFormatter, sCode, -0.000999991, eLang, sExpected); + sExpected = "-1.00E-03"; + checkPreviewString(aFormatter, sCode, -0.000999999, eLang, sExpected); + } } CPPUNIT_TEST_SUITE_REGISTRATION(Test); commit 63bc2b13cb344cce99348496838d7d2c2f690211 Author: Eike Rathke <er...@redhat.com> Date: Wed Feb 15 22:01:51 2017 +0100 Resolves: tdf#105968 handle engineering notation rounded into next magnitude Change-Id: Ie31ab88543994f0e8aeef8152c230c05e071ef8e diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx index 8178b7e..ac0c608 100644 --- a/svl/source/numbers/zformat.cxx +++ b/svl/source/numbers/zformat.cxx @@ -2593,11 +2593,22 @@ bool SvNumberformat::ImpGetScientificOutput(double fNumber, nExpSign = 1; } ExpStr = OUString::number( nExp ); + const sal_Unicode cFirstDigit = sStr[0]; // rescale mantissa sStr = ::rtl::math::doubleToUString( fNumber, rtl_math_StringFormat_E, nRescale + rInfo.nCntPost, '.' ); + + // sStr now may contain a rounded-up value shifted into the next + // magnitude, for example 1.000E+02 (4 digits) for fNumber 99.995 + // (9.9995E+02 rounded to 3 decimals) but we want the final result + // to be 100.00E+00 (5 digits), so for the following fill routines + // below to work correctly append a zero decimal. + /* TODO: this is awkward, could an engineering notation mode be + * introduced to rtl_math_doubleToUString()? */ sStr.truncate( sStr.indexOf('E') ); + if (sStr[0] == '1' && cFirstDigit != '1') + sStr.append('0'); } // cut any decimal delimiter _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits