Bug #11953 Updated: wrong conversion from data type NUMERIC with decimal places into string
| From: | derick@php.net | Date: | Sat, 25 May 2002 13:22:20 +0000 |
| Subject: | Bug #11953 Updated: wrong conversion from data type NUMERIC with decimal places into string | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-8531@lists.php.net to get a copy of this message | ||
ID: 11953
Updated by: derick@php.net
Reported By: phpbug@mts.cz
-Status: Open
+Status: Closed
Bug Type: InterBase related
Operating System: Linux
PHP Version: 4.0.5
New Comment:
Thank you for your bug report. This issue has already been fixed
in the latest released version of PHP, which you can download at
http://www.php.net/downloads.php
Previous Comments:
------------------------------------------------------------------------
[2001-07-07 22:23:21] phpbug@mts.cz
When the database column has type NUMERIC(10,3) and you stored value
12.01, when you would like to retrieve it you get 10.1. Following patch
fixes this bug.
Regards, Libor Chocholaty
--- php-4.0.5-orig/ext/interbase/interbase.c Mon Feb 26 07:07:00
2001
+++ php-4.0.5/ext/interbase/interbase.c Sun Jul 8 04:02:11 2001
@@ -25,6 +25,10 @@
/*
Changes:
+ 2001-07-08: Libor Chocholaty
<chocholaty@obolus.cz>
+ - fixed problem with conversion from numeric
+ with decimal places internally stored as
+ ISC_INT64 to string.
1999-09-21: Ivo Panacek <ivop@regionet.cz>
- added COMPILE_DL section
- more verbose php_info_ibase function
@@ -1778,11 +1782,24 @@
break;
#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(-
(ISC_INT64) abs((int) (*((ISC_INT64 *)data) %
- val->value.str.val = estrdup(string_data);
+ {
+ char aux_str[40], *fract;
+ long long aux_long = (ISC_INT64)
abs((int) (*((ISC_INT64 *)data) % (int) pow(10.0, (double) -sc+
sprintf(aux_str, "0000000000000000000%Ld",
aux_long);
+ fract = aux_str + strlen(aux_str) +
scale;
+
+
+ val->type = IS_STRING;
+
+ sprintf(string_data, "%Ld", (ISC_INT64)
(*((ISC_INT64 *)data) / (int) pow(10.0, (double) -scale+
if (aux_long)
+ {
+ strcat(string_data, ".");
+ strcat(string_data, fract);
+ }
+ val->value.str.len =
strlen(string_data);
+ val->value.str.val =
estrdup(string_data);
+ }
break;
#endif
#ifndef SQL_TIMESTAMP
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=11953&edit=1