Bug #14755 Updated: 105.05$ becomes 105.5$ !!! - I found the fix.
| From: | sander@php.net | Date: | Wed, 02 Jan 2002 16:30:07 +0000 |
| Subject: | Bug #14755 Updated: 105.05$ becomes 105.5$ !!! - I found the fix. | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-75605@lists.php.net to get a copy of this message | ||
ID: 14755
Updated by: sander
Reported By: giancarlo@niccolai.ws
Status: Open
Bug Type: InterBase related
Operating System: ALL
PHP Version: 4.1.1
New Comment:
This is a fix for 12383. Can somebody look into it and apply the fix?
Previous Comments:
------------------------------------------------------------------------
[2001-12-29 13:22:59] giancarlo@niccolai.ws
Hello. I found a nasty bug in interbase extension, and I
have the solution here. You have only to put it in the
source code; I would but I don't know how to do this. I
already posted the authors, but with no result.
104.05$ become 104.5$ !!!
When traslating scaled numeric fields (i.e. with
decimals), the routine _php_ibase_var_pval is faulty;
here is the original code:
#ifdef SQL_INT64
case SQL_INT64:
val->type = IS_STRING;
val->value.str.len = sprintf(string_data, "%Ld.%Ld",
(ISC_INT64) (*((ISC_INT64 *)data) /
(int) pow(10.0, (double) -scale)),
(ISC_INT64) abs((int) (*((ISC_INT64 *)data) %
(int) pow(10.0, (double) -scale))));
val->value.str.val = estrdup(string_data);
break;
#endif
You can clearly see that this code is fine if the decimal
part has no 0s before the first non 0 cipher. Here is
my correction:
#ifdef SQL_INT64
case SQL_INT64:
val->type = IS_STRING;
/* Experimental section by Giancarlo Niccolai */
if (scale) {
int i, len;
char dt[20];
double number = (double) ((ISC_INT64)
(*((ISC_INT64 *)data)));
for (i = 0; i < -scale; i++)
number /= 10;
sprintf(dt, "%%0.%df", -scale);
val->value.str.len = sprintf (string_data, dt ,
number);
}
else {
val->value.str.len = sprintf (string_data, "%Ld",
(ISC_INT64) (*((ISC_INT64 *)data)));
}
/* End of experimental section */
val->value.str.val = estrdup(string_data);
break;
#endif
Please, since Interbase is used for e-commerce, all the
php-interbase applications can be at risk, if the site
deals with cents...
------------------------------------------------------------------------
Edit this bug report at http://bugs.php.net/?id=14755&edit=1