sc/source/ui/view/tabvwsha.cxx | 14 +---------- svl/source/numbers/zformat.cxx | 52 +++++++++++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 29 deletions(-)
New commits: commit ef0a26835e68deb31906c40cfe48c66674d9d0d1 Author: Eike Rathke <er...@redhat.com> Date: Tue Sep 29 15:54:19 2015 +0200 use exponential 'E' format for General when appropriate Fixes all these test case scenarios: 1. in A1 enter =1E222 * move cell cursor back onto A1 * status bar displays Sum=100000... repeated until filled (or 222 '0' characters) 2. invoke number format dialog on A1 * for General format 100000... is displayed in the preview 3. move cell cursor to A2 * open Function Wizard (Ctrl+F2) * choose (double click) ABS function * enter A1 as parameter * see 100000... displayed as Function result and Result 4. save as .ods * in content.xml see display text of A1 being saved as 100000... Change-Id: I7c22c0461a6783c85c1d51c31e8607fb2edb821c diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx index 2dc1c54..eccf63f 100644 --- a/svl/source/numbers/zformat.cxx +++ b/svl/source/numbers/zformat.cxx @@ -54,6 +54,11 @@ char const GREGORIAN[] = "gregorian"; const sal_uInt16 UPPER_PRECISION = 300; // entirely arbitrary... const double EXP_LOWER_BOUND = 1.0E-4; // prefer scientific notation below this value. +const double EXP_ABS_UPPER_BOUND = 1.0E15; // use exponential notation above that absolute value. + // Back in time was E16 that lead + // to display rounding errors, see + // also sal/rtl/math.cxx + // doubleToString() } // namespace @@ -1733,7 +1738,7 @@ void SvNumberformat::ImpGetOutputStandard(double& fNumber, OUString& rOutString) { sal_uInt16 nStandardPrec = rScan.GetStandardPrec(); - if ( fabs(fNumber) > 1.0E15 ) // #58531# was E16 + if ( fabs(fNumber) > EXP_ABS_UPPER_BOUND ) { nStandardPrec = ::std::min(nStandardPrec, static_cast<sal_uInt16>(14)); // limits to 14 decimals rOutString = ::rtl::math::doubleToUString( fNumber, @@ -2126,27 +2131,40 @@ bool SvNumberformat::GetOutputString(double fNumber, } fNumber = -fNumber; } + /* TODO: why did we insist on 10 decimals for the non-exponent + * case? doubleToUString() handles rtl_math_DecimalPlaces_Max + * gracefully when used with rtl_math_StringFormat_Automatic, + * so all that special casing and mumbo-jumbo in the else + * branch below might not be needed at all. */ + if (fNumber > EXP_ABS_UPPER_BOUND) + { + sBuff.append( ::rtl::math::doubleToUString( fNumber, + rtl_math_StringFormat_Automatic, + rtl_math_DecimalPlaces_Max, + GetFormatter().GetNumDecimalSep()[0], true)); + } + else { OUString sTemp; ImpGetOutputStdToPrecision(fNumber, sTemp, 10); // Use 10 decimals for general 'unlimited' format. sBuff.append(sTemp); - } - if (fNumber < EXP_LOWER_BOUND) - { - sal_Int32 nLen = sBuff.getLength(); - if (!nLen) + if (fNumber < EXP_LOWER_BOUND) { - return false; - } - // #i112250# With the 10-decimal limit, small numbers are formatted as "0". - // Switch to scientific in that case, too: - if (nLen > 11 || ((nLen == 1 && sBuff[0] == '0') && fNumber != 0.0)) - { - sal_uInt16 nStandardPrec = rScan.GetStandardPrec(); - nStandardPrec = ::std::min(nStandardPrec, static_cast<sal_uInt16>(14)); // limits to 14 decimals - sBuff = ::rtl::math::doubleToUString( fNumber, - rtl_math_StringFormat_E2, nStandardPrec /*2*/, - GetFormatter().GetNumDecimalSep()[0], true); + sal_Int32 nLen = sBuff.getLength(); + if (!nLen) + { + return false; + } + // #i112250# With the 10-decimal limit, small numbers are formatted as "0". + // Switch to scientific in that case, too: + if (nLen > 11 || ((nLen == 1 && sBuff[0] == '0') && fNumber != 0.0)) + { + sal_uInt16 nStandardPrec = rScan.GetStandardPrec(); + nStandardPrec = ::std::min(nStandardPrec, static_cast<sal_uInt16>(14)); // limits to 14 decimals + sBuff = ::rtl::math::doubleToUString( fNumber, + rtl_math_StringFormat_E2, nStandardPrec /*2*/, + GetFormatter().GetNumDecimalSep()[0], true); + } } } if (bSign) commit 82d1c4b9bbc2987dc1bd640f9af24c60af7d6fdc Author: Eike Rathke <er...@redhat.com> Date: Tue Sep 29 14:18:19 2015 +0200 Revert "do not use unlimited precision in status bar" ... that cured only a symptom. This reverts commit 04aceed37a42245392ed4671d276dd2de6118a89. diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx index dce648c..f6ac626 100644 --- a/sc/source/ui/view/tabvwsha.cxx +++ b/sc/source/ui/view/tabvwsha.cxx @@ -123,18 +123,8 @@ bool ScTabViewShell::GetFunction( OUString& rFuncStr, sal_uInt16 nErrCode ) } OUString aValStr; - // Do not use the unlimited precision of the General format or - // the display string for 1E+222 would be '1' and 222 repeated - // '0' characters in the status bar ... Instead of setting - // standard precision back and forth simply use the input line - // string. - if ((nNumFmt % SV_COUNTRY_LANGUAGE_OFFSET) == 0) - pFormatter->GetInputLineString( nVal, nNumFmt, aValStr); - else - { - Color* pDummy; - pFormatter->GetOutputString( nVal, nNumFmt, aValStr, &pDummy ); - } + Color* pDummy; + pFormatter->GetOutputString( nVal, nNumFmt, aValStr, &pDummy ); aStr += aValStr; } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits