Bug #15151 Updated: Decimals/Numerics stored as int64 always display as xxx.2

From: Date: Wed, 27 Mar 2002 17:17:46 +0000
Subject: Bug #15151 Updated: Decimals/Numerics stored as int64 always display as xxx.2
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-3499@lists.php.net to get a copy of this message
 ID:               15151
 Updated by:       derick@php.net
 Reported By:      mitch@tropical.co.cr
-Status:           Open
+Status:           Feedback
 Bug Type:         InterBase related
 Operating System: Windows
 PHP Version:      4.1.1
 New Comment:

please make a patch against the current CVS version.

Derick


Previous Comments:
------------------------------------------------------------------------

[2002-03-27 11:08:06] mitch@tropical.co.cr

The original fix I posted has its own bug (due to me not VC++) when the
number is less than 0 but greater than -1 the negative sign does not
appear.  This fixes it (and the original problem also):
Add these declarations:
 ISC_INT64	tv64;
 ISC_INT64	iv64;
 ISC_INT64	fv64;

then change the code:

case SQL_INT64:
 tv64 = (ISC_INT64) *((ISC_INT64 *) data);
 iv64 = (tv64 / (int) pow(10.0, (double) -scale));
 fv64 = (ISC_INT64) abs((int) tv64
       % (int) pow(10.0, (double) -scale));
 val->type = IS_STRING;
 if ( tv64 < 0  &&  iv64 == 0 ) 
  val->value.str.len = sprintf(string_data, "-0");
 else
  val->value.str.len = sprintf(string_data, "%Ld", iv64);
 val->value.str.len += sprintf(string_data +
           val->value.str.len, ".%0*Ld", -scale, fv64);
 val->value.str.val = estrdup(string_data);
 break;

------------------------------------------------------------------------

[2002-03-27 11:06:10] mitch@tropical.co.cr

The original fix I posted has its own bug (due to me not VC++) when the
number is less than 0 but greater than -1 the negative sign does not
appear.  This fixes it (and the original problem also):
case SQL_INT64:
tv64 = (ISC_INT64) *((ISC_INT64 *) data);
			iv64 = (tv64 / (int) pow(10.0, (double) -scale));
			fv64 = (ISC_INT64) abs((int) tv64 % (int) pow(10.0, (double)
-scale));
			val->type = IS_STRING;
			if ( tv64 < 0  &&  iv64 == 0 ) 
				val->value.str.len = sprintf(string_data, "-0");
			else
				val->value.str.len = sprintf(string_data, "%Ld", iv64);
			val->value.str.len += sprintf(string_data + val->value.str.len,
".%0*Ld", -scale, fv64);
			val->value.str.val = estrdup(string_data);
			break;

------------------------------------------------------------------------

[2002-01-21 13:15:30] mitch@tropical.co.cr

This is also reported as #13807

------------------------------------------------------------------------

[2002-01-21 13:10:17] mitch@tropical.co.cr

Decimals/Numerics that are stored as 64-bit integers always display as
xxx.2.

The following should fix the problem:

Original code (on or about line 1782):

val->value.str.len = sprintf(string_data, "%Ld.%0*Ld",
     (ISC_INT64) (*((ISC_INT64 *)data) /
     (int) pow(10.0, (double) -scale)),
     -scale,
     (ISC_INT64) abs((int) (*((ISC_INT64 *)data) %
     (int) pow(10.0, (double) -scale))));

Change to:
val->value.str.len = sprintf(string_data, "%Ld",
     (ISC_INT64) (*((ISC_INT64 *)data) /
     (int) pow(10.0, (double) -scale)));
val->value.str.len += sprintf(string_data +
     val->value.str.len, ".%0*Ld",
     -scale,
    (ISC_INT64) abs((int) (*((ISC_INT64 *)data) %
    (int) pow(10.0, (double) -scale))));



The problem is with MSVC++.  It doesn't seem to like two int64s in the
same sprintf statement.  I don't yet have all the pieces to compile the
extension so I have not fully tested it, but I have duplicated the
problem in a test program and verified that the above code fixes the
problem in the test program.

------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=15151&edit=1



Thread (1 message)

  • derick@php.net
  • Unknown Message
    • derick@php.net
« previous php.bugs (#3499) next »