[Libreoffice-commits] core.git: 2 commits - sc/source svl/source

Eike Rathke erack at redhat.com
Tue Sep 29 07:02:29 PDT 2015


 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 <erack at 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 <erack at 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;
             }
         }


More information about the Libreoffice-commits mailing list