[Libreoffice-commits] core.git: chart2/source include/rtl sal/rtl svl/source

Laurent Balland-Poirier laurent.balland-poirier at laposte.net
Mon Feb 23 12:26:59 PST 2015


 chart2/source/inc/RegressionCalculationHelper.hxx |    2 -
 include/rtl/math.h                                |   20 ++++++++++++++++
 sal/rtl/math.cxx                                  |   26 ++++++++++++++--------
 svl/source/numbers/zformat.cxx                    |   25 ++++++++++++---------
 4 files changed, 53 insertions(+), 20 deletions(-)

New commits:
commit cc8a2d00387d554cd4d694503dd25fa8f950a78f
Author: Laurent Balland-Poirier <laurent.balland-poirier at laposte.net>
Date:   Fri Feb 20 09:54:01 2015 +0100

    tdf#88835 Calc: General format: 2 digits in exponent
    
    Create 4 new formats enums rtl_math_StringFormat:
    rtl_math_StringFormat_E1, rtl_math_StringFormat_E2,
    rtl_math_StringFormat_G1, rtl_math_StringFormat_G2
    to 1 or 2 digits in exponent for scientific notation.
    
    Set General format to use rtl_math_StringFormat_E2.
    Set trendline equation in status bar to use rtl_math_StringFormat_E1
    
    Change-Id: I41466a6d4ba808ba5b9b38ba252b37c6b4560f12
    Reviewed-on: https://gerrit.libreoffice.org/14562
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/chart2/source/inc/RegressionCalculationHelper.hxx b/chart2/source/inc/RegressionCalculationHelper.hxx
index 53fb9f0..32456cf 100644
--- a/chart2/source/inc/RegressionCalculationHelper.hxx
+++ b/chart2/source/inc/RegressionCalculationHelper.hxx
@@ -27,7 +27,7 @@
 #include <vector>
 
 #define NUMBER_TO_STR(number) (OStringToOUString(::rtl::math::doubleToString( \
-          number, rtl_math_StringFormat_G, 4, '.', true ),RTL_TEXTENCODING_ASCII_US ))
+          number, rtl_math_StringFormat_G1, 4, '.', true ),RTL_TEXTENCODING_ASCII_US ))
 
 #define UC_SPACE (sal_Unicode(' '))
 #define UC_MINUS_SIGN (sal_Unicode('-'))
diff --git a/include/rtl/math.h b/include/rtl/math.h
index 99a4b71..40440a7 100644
--- a/include/rtl/math.h
+++ b/include/rtl/math.h
@@ -53,6 +53,26 @@ enum rtl_math_StringFormat
      */
     rtl_math_StringFormat_Automatic,
 
+    /** Same 'E', but with only 1 minimum digits in exponent.
+        @since LibreOffice 4.5
+     */
+    rtl_math_StringFormat_E1,
+
+    /** Same 'E', but with only 2 minimum digits in exponent.
+        @since LibreOffice 4.5
+     */
+    rtl_math_StringFormat_E2,
+
+    /** Same 'G', but with only 1 minimum digits in exponent.
+        @since LibreOffice 4.5
+     */
+    rtl_math_StringFormat_G1,
+
+    /** Same 'G', but with only 2 minimum digits in exponent.
+        @since LibreOffice 4.5
+     */
+    rtl_math_StringFormat_G2,
+
     /** @cond INTERNAL */
     rtl_math_StringFormat_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
     /** @endcond */
diff --git a/sal/rtl/math.cxx b/sal/rtl/math.cxx
index d74f502..36a66a8 100644
--- a/sal/rtl/math.cxx
+++ b/sal/rtl/math.cxx
@@ -368,13 +368,20 @@ inline void doubleToString(StringT ** pResult,
         }
         break;
         case rtl_math_StringFormat_G :
+        case rtl_math_StringFormat_G1 :
+        case rtl_math_StringFormat_G2 :
         {   // G-Point, similar to sprintf %G
             if ( nDecPlaces == rtl_math_DecimalPlaces_DefaultSignificance )
                 nDecPlaces = 6;
             if ( nExp < -4 || nExp >= nDecPlaces )
             {
                 nDecPlaces = std::max< sal_Int32 >( 1, nDecPlaces - 1 );
-                eFormat = rtl_math_StringFormat_E;
+                if( eFormat == rtl_math_StringFormat_G )
+                    eFormat = rtl_math_StringFormat_E;
+                else if( eFormat == rtl_math_StringFormat_G2 )
+                    eFormat = rtl_math_StringFormat_E2;
+                else if( eFormat == rtl_math_StringFormat_G1 )
+                    eFormat = rtl_math_StringFormat_E1;
             }
             else
             {
@@ -593,9 +600,9 @@ inline void doubleToString(StringT ** pResult,
     }
 
     // Print the exponent ('E', followed by '+' or '-', followed by exactly
-    // three digits).  The code in rtl_[u]str_valueOf{Float|Double} relies on
-    // this format.
-    if( eFormat == rtl_math_StringFormat_E )
+    // three digits for rtl_math_StringFormat_E).  The code in
+    // rtl_[u]str_valueOf{Float|Double} relies on this format.
+    if( eFormat == rtl_math_StringFormat_E || eFormat == rtl_math_StringFormat_E2 || eFormat == rtl_math_StringFormat_E1 )
     {
         if ( p == pBuf )
             *p++ = static_cast< typename T::Char >('1');
@@ -608,12 +615,13 @@ inline void doubleToString(StringT ** pResult,
         }
         else
             *p++ = static_cast< typename T::Char >('+');
-//      if (nExp >= 100 )
-        *p++ = static_cast< typename T::Char >(
-            nExp / 100 + static_cast< typename T::Char >('0') );
+        if ( eFormat == rtl_math_StringFormat_E || nExp >= 100 )
+            *p++ = static_cast< typename T::Char >(
+                nExp / 100 + static_cast< typename T::Char >('0') );
         nExp %= 100;
-        *p++ = static_cast< typename T::Char >(
-            nExp / 10 + static_cast< typename T::Char >('0') );
+        if ( eFormat == rtl_math_StringFormat_E || eFormat == rtl_math_StringFormat_E2 || nExp >= 10 )
+            *p++ = static_cast< typename T::Char >(
+                nExp / 10 + static_cast< typename T::Char >('0') );
         *p++ = static_cast< typename T::Char >(
             nExp % 10 + static_cast< typename T::Char >('0') );
     }
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 45093a9..bffdd53 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -1711,27 +1711,27 @@ OUString SvNumberformat::StripNewCurrencyDelimiters( const OUString& rStr,
     return aTmp;
 }
 
-void SvNumberformat::ImpGetOutputStandard(double& fNumber, OUStringBuffer& OutString)
+void SvNumberformat::ImpGetOutputStandard(double& fNumber, OUStringBuffer& rOutString)
 {
     OUString sTemp;
     ImpGetOutputStandard(fNumber, sTemp);
-    OutString = sTemp;
+    rOutString = sTemp;
 }
 
-void SvNumberformat::ImpGetOutputStandard(double& fNumber, OUString& OutString)
+void SvNumberformat::ImpGetOutputStandard(double& fNumber, OUString& rOutString)
 {
     sal_uInt16 nStandardPrec = rScan.GetStandardPrec();
 
     if ( fabs(fNumber) > 1.0E15 ) // #58531# was E16
     {
         nStandardPrec = ::std::min(nStandardPrec, static_cast<sal_uInt16>(14)); // limits to 14 decimals
-        OutString = ::rtl::math::doubleToUString( fNumber,
-                                                  rtl_math_StringFormat_E, nStandardPrec /*2*/,
+        rOutString = ::rtl::math::doubleToUString( fNumber,
+                                                  rtl_math_StringFormat_E2, nStandardPrec /*2*/,
                                                   GetFormatter().GetNumDecimalSep()[0]);
     }
     else
     {
-        ImpGetOutputStdToPrecision(fNumber, OutString, nStandardPrec);
+        ImpGetOutputStdToPrecision(fNumber, rOutString, nStandardPrec);
     }
 }
 
@@ -1959,8 +1959,13 @@ void lcl_GetOutputStringScientific(double fNumber, sal_uInt16 nCharCount,
 {
     bool bSign = ::rtl::math::isSignBitSet(fNumber);
 
-    // 1.000E+015 (one digit and the decimal point, and the five chars for the exponential part, totalling 7).
-    sal_uInt16 nPrec = nCharCount > 7 ? nCharCount - 7 : 0;
+    // 1.000E+015 (one digit and the decimal point, and the two chars +
+    // nExpDigit for the exponential part, totalling 6 or 7).
+    double fExp = log10( fabs(fNumber) );
+    if( fExp < 0.0 )
+      fExp = 1.0 - fExp;
+    sal_uInt16 nCharFormat = 6 + (fExp >= 100.0 ? 1 : 0);
+    sal_uInt16 nPrec = nCharCount > nCharFormat ? nCharCount - nCharFormat : 0;
     if (nPrec && bSign)
     {
         // Make room for the negative sign.
@@ -1968,7 +1973,7 @@ void lcl_GetOutputStringScientific(double fNumber, sal_uInt16 nCharCount,
     }
     nPrec = ::std::min(nPrec, static_cast<sal_uInt16>(14)); // limit to 14 decimals.
 
-    rOutString = ::rtl::math::doubleToUString(fNumber, rtl_math_StringFormat_E,
+    rOutString = ::rtl::math::doubleToUString(fNumber, rtl_math_StringFormat_E2,
                                               nPrec, rFormatter.GetNumDecimalSep()[0]);
 }
 
@@ -2129,7 +2134,7 @@ bool SvNumberformat::GetOutputString(double fNumber,
                         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_E, nStandardPrec /*2*/,
+                                                              rtl_math_StringFormat_E2, nStandardPrec /*2*/,
                                                               GetFormatter().GetNumDecimalSep()[0], true);
                     }
                 }


More information about the Libreoffice-commits mailing list