[ast] fix string() and sci2exp() regressions after b9e819c8 44/20744/9
St├ęphane MOTTELET [Fri, 25 Jan 2019 23:44:47 +0000 (00:44 +0100)]
Regression detected by Samuel (test_run string bug_15260).
As a side effect, also fixes ambiguous display of floating
point numbers as pointed out by Samuel, again ;-) a long
time ago @ http://bugzilla.scilab.org/show_bug.cgi?id=2745

For example (default format lenght):

--> 1+%eps
 ans  =

   1.0000000

--> 1+%eps/2
 ans  =

   1.

string() behavior and polynom display remains the same as
before, i.e

--> x=1.00000001
 x  =

   1.0000000

--> string(x)
 ans  =

 1

--> x*(1+%s)
 ans  =

   1 +1s

Change-Id: I4dbcad7091c8de1144b84a4c2b4ec57b1e75e045

scilab/modules/ast/src/cpp/types/tostring_common.cpp

index 16ced09..7ade705 100644 (file)
@@ -28,6 +28,7 @@ extern "C"
 #include "os_string.h"
 #include "dtoa.h"
 #include "charEncoding.h"
+#include "sciprint.h"
 }
 
 #define BLANK_SIZE 1
@@ -314,17 +315,30 @@ void addDoubleValue(std::wostringstream * _postr, double _dblVal, DoubleFormat *
             str.insert(str.begin(), 1 - iDecpt, '0');
             str.insert(1, ".");
         }
-        else if (_pDF->bPrintPoint || iDecpt < str.length())
+        else if (_pDF->bPrintPoint || iDecpt < (int)str.length())
         {
-            str.append(std::max(0, (int)(iDecpt - str.length())), '0');
+            str.append(std::max(0, (iDecpt - (int)str.length())), '0');
             str.insert(iDecpt, ".");
         }
-        else 
+        else
         {
-            str.append(std::max(0, (int)(iDecpt - str.length())), '0');
+            str.append(std::max(0, (iDecpt - (int)str.length())), '0');
             iWidth--;
         }
 
+        // append trailing zeros, if applicable
+        if (std::atof(str.data()) != fabs(_dblVal))
+        {
+            if (_pDF->bPrintPoint)
+            {
+                str.append(std::max(0, (ConfigVariable::getFormatSize() - (int)str.length()))-1, '0');
+            }
+            else
+            {
+                iWidth = 1+str.length();
+            }
+        }
+
         wchar_t* pwstData = to_wide_string(str.data());
         os_swprintf(pwstOutput, 32, L"%ls%-*ls", pwstSign, iWidth-1, pwstData);
         FREE(pwstData);