summaryrefslogtreecommitdiffstats
path: root/sal
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2019-08-09 15:11:09 +0200
committerAndras Timar <andras.timar@collabora.com>2019-08-30 10:37:36 +0200
commitb7f62ed447ace5a6e7a0a5188cb72c635736b7f9 (patch)
tree4cfe980ec04a02a067844a16d368ea545b66a42c /sal
parentsd lok: extend language status with BCP 47 language tag info in here as well (diff)
downloadcore-b7f62ed447ace5a6e7a0a5188cb72c635736b7f9.tar.gz
core-b7f62ed447ace5a6e7a0a5188cb72c635736b7f9.zip
Resolves: tdf#126766 fix rounding correction at start of negative values
doubleToString() is entered with an inaccuracy afflicted fValue=-9999.9999999999927 for which the rounding into the next magnitude incremented the '-' character to '.' instead of appending a '1' (and '0' and then "000") thus yielded ".0000" instead of "-10000" This seems to have been always the case. Change-Id: I66170defa71fec40ca0b85f68affde8eff0d5ccb Reviewed-on: https://gerrit.libreoffice.org/77208 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins (cherry picked from commit be8da97976658ff19b4dd010bff328cd3f424c1b) Reviewed-on: https://gerrit.libreoffice.org/77216 Reviewed-by: Michael Stahl <Michael.Stahl@cib.de> Reviewed-on: https://gerrit.libreoffice.org/77911 Reviewed-by: Andras Timar <andras.timar@collabora.com> Tested-by: Andras Timar <andras.timar@collabora.com>
Diffstat (limited to 'sal')
-rw-r--r--sal/rtl/math.cxx14
1 files changed, 12 insertions, 2 deletions
diff --git a/sal/rtl/math.cxx b/sal/rtl/math.cxx
index 9fd7983f8787..18ee802316bb 100644
--- a/sal/rtl/math.cxx
+++ b/sal/rtl/math.cxx
@@ -546,9 +546,13 @@ void doubleToString(typename T::String ** pResult,
if (nDigit >= 10)
{ // after-treatment of up-rounding to the next decade
sal_Int32 sLen = static_cast< long >(p-pBuf)-1;
- if (sLen == -1)
+ if (sLen == -1 || (sLen == 0 && bSign))
{
+ // Assert that no one changed the logic we rely on.
+ assert(!bSign || *pBuf == static_cast< typename T::Char >('-'));
p = pBuf;
+ if (bSign)
+ ++p;
if (eFormat == rtl_math_StringFormat_F)
{
*p++ = static_cast< typename T::Char >('1');
@@ -568,6 +572,12 @@ void doubleToString(typename T::String ** pResult,
for (sal_Int32 j = sLen; j >= 0; j--)
{
typename T::Char cS = pBuf[j];
+ if (j == 0 && bSign)
+ {
+ // Do not touch leading minus sign put earlier.
+ assert(cS == static_cast< typename T::Char >('-'));
+ break; // for, this is the last character backwards.
+ }
if (cS != cDecSeparator)
{
if (cS != static_cast< typename T::Char >('9'))
@@ -578,7 +588,7 @@ void doubleToString(typename T::String ** pResult,
else
{
pBuf[j] = static_cast< typename T::Char >('0');
- if (j == 0)
+ if (j == 0 || (j == 1 && bSign))
{
if (eFormat == rtl_math_StringFormat_F)
{ // insert '1'