|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2002-01-21 13:10 UTC] mitch at tropical dot co dot 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.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 22:00:01 2025 UTC |
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;