Kaydet (Commit) c8ea6ec1 authored tarafından Eike Rathke's avatar Eike Rathke Kaydeden (comit) Andras Timar

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
(cherry picked from commit ef0a2683)
Reviewed-on: https://gerrit.libreoffice.org/18924Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
(cherry picked from commit 746359e4)
üst c5d54077
...@@ -55,6 +55,11 @@ char const GREGORIAN[] = "gregorian"; ...@@ -55,6 +55,11 @@ char const GREGORIAN[] = "gregorian";
const sal_uInt16 UPPER_PRECISION = 300; // entirely arbitrary... 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_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 } // namespace
...@@ -1717,7 +1722,7 @@ void SvNumberformat::ImpGetOutputStandard(double& fNumber, OUString& rOutString) ...@@ -1717,7 +1722,7 @@ void SvNumberformat::ImpGetOutputStandard(double& fNumber, OUString& rOutString)
{ {
sal_uInt16 nStandardPrec = rScan.GetStandardPrec(); 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 nStandardPrec = ::std::min(nStandardPrec, static_cast<sal_uInt16>(14)); // limits to 14 decimals
rOutString = ::rtl::math::doubleToUString( fNumber, rOutString = ::rtl::math::doubleToUString( fNumber,
...@@ -2110,27 +2115,40 @@ bool SvNumberformat::GetOutputString(double fNumber, ...@@ -2110,27 +2115,40 @@ bool SvNumberformat::GetOutputString(double fNumber,
} }
fNumber = -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; OUString sTemp;
ImpGetOutputStdToPrecision(fNumber, sTemp, 10); // Use 10 decimals for general 'unlimited' format. ImpGetOutputStdToPrecision(fNumber, sTemp, 10); // Use 10 decimals for general 'unlimited' format.
sBuff.append(sTemp); sBuff.append(sTemp);
} if (fNumber < EXP_LOWER_BOUND)
if (fNumber < EXP_LOWER_BOUND)
{
sal_Int32 nLen = sBuff.getLength();
if (!nLen)
{ {
return false; sal_Int32 nLen = sBuff.getLength();
} if (!nLen)
// #i112250# With the 10-decimal limit, small numbers are formatted as "0". {
// Switch to scientific in that case, too: return false;
if (nLen > 11 || ((nLen == 1 && sBuff[0] == '0') && fNumber != 0.0)) }
{ // #i112250# With the 10-decimal limit, small numbers are formatted as "0".
sal_uInt16 nStandardPrec = rScan.GetStandardPrec(); // Switch to scientific in that case, too:
nStandardPrec = ::std::min(nStandardPrec, static_cast<sal_uInt16>(14)); // limits to 14 decimals if (nLen > 11 || ((nLen == 1 && sBuff[0] == '0') && fNumber != 0.0))
sBuff = ::rtl::math::doubleToUString( fNumber, {
rtl_math_StringFormat_E2, nStandardPrec /*2*/, sal_uInt16 nStandardPrec = rScan.GetStandardPrec();
GetFormatter().GetNumDecimalSep()[0], true); 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) if (bSign)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment