Bug #11953 Updated: wrong conversion from data type NUMERIC with decimal places into string

From: 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

« previous php.bugs (#8531) next »