summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Balland-Poirier <laurent.balland-poirier@laposte.net>2015-02-20 09:54:01 +0100
committerEike Rathke <erack@redhat.com>2015-02-23 20:26:34 +0000
commitcc8a2d00387d554cd4d694503dd25fa8f950a78f (patch)
treeb0ad643d6a0252c7dd359a203c89c5e3533b8fb5
parentd1f679cacb2e17c4aa94ae6b9f15011c9ec74b25 (diff)
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@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r--chart2/source/inc/RegressionCalculationHelper.hxx2
-rw-r--r--include/rtl/math.h20
-rw-r--r--sal/rtl/math.cxx26
-rw-r--r--svl/source/numbers/zformat.cxx25
4 files changed, 53 insertions, 20 deletions
diff --git a/chart2/source/inc/RegressionCalculationHelper.hxx b/chart2/source/inc/RegressionCalculationHelper.hxx
index 53fb9f032473..32456cf8dbb4 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 99a4b71cfa80..40440a7c1e08 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 d74f5020bc1a..36a66a8711cf 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 45093a9aba29..bffdd53368f4 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);
}
}