helly Sun Jul 16 10:49:06 2006 UTC
Added files:
/php-src/ext/standard/tests/strings bug29538.phpt
Modified files:
/php-src/ext/standard math.c
Log:
- Fixed Bug #29538 number_format and problem with 0
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/math.c?r1=1.134&r2=1.135&diff_format=u
Index: php-src/ext/standard/math.c
diff -u php-src/ext/standard/math.c:1.134 php-src/ext/standard/math.c:1.135
--- php-src/ext/standard/math.c:1.134 Mon Feb 6 11:28:20 2006
+++ php-src/ext/standard/math.c Sun Jul 16 10:49:06 2006
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: math.c,v 1.134 2006/02/06 11:28:20 tony2001 Exp $ */
+/* $Id: math.c,v 1.135 2006/07/16 10:49:06 helly Exp $ */
#include "php.h"
#include "php_math.h"
@@ -976,13 +976,8 @@
is_negative = 1;
d = -d;
}
- if (!dec_point && dec > 0) {
- d *= pow(10, dec);
- dec = 0;
- } else {
- dec = MAX(0, dec);
- }
+ dec = MAX(0, dec);
PHP_ROUND_WITH_FUZZ(d, dec);
tmplen = spprintf(&tmpbuf, 0, "%.*f", dec, d);
@@ -991,8 +986,10 @@
return tmpbuf;
}
+ /* find decimal point, if expected */
+ dp = dec ? strchr(tmpbuf, '.') : NULL;
+
/* calculate the length of the return buffer */
- dp = strchr(tmpbuf, '.');
if (dp) {
integral = dp - tmpbuf;
} else {
@@ -1008,7 +1005,11 @@
reslen = integral;
if (dec) {
- reslen += 1 + dec;
+ reslen += dec;
+
+ if (dec_point) {
+ reslen++;
+ }
}
/* add a byte for minus sign */
@@ -1025,29 +1026,29 @@
* Take care, as the sprintf implementation may return less places than
* we requested due to internal buffer limitations */
if (dec) {
- int declen = dp ? strlen(dp+1) : 0;
- int topad = declen > 0 ? dec - declen : 0;
+ int declen = dp ? s - dp : 0;
+ int topad = dec > declen ? dec - declen : 0;
/* pad with '0's */
-
while (topad--) {
*t-- = '0';
}
if (dp) {
- /* now copy the chars after the point */
- memcpy(t - declen + 1, dp + 1, declen);
-
+ s -= declen + 1; /* +1 to skip the point */
t -= declen;
- s -= declen;
+
+ /* now copy the chars after the point */
+ memcpy(t + 1, dp + 1, declen);
}
/* add decimal point */
- *t-- = dec_point;
- s--;
+ if (dec_point) {
+ *t-- = dec_point;
+ }
}
- /* copy the numbers before the decimal place, adding thousand
+ /* copy the numbers before the decimal point, adding thousand
* separator every three digits */
while(s >= tmpbuf) {
*t-- = *s--;
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/strings/bug29538.phpt?view=markup&rev=1.1
Index: php-src/ext/standard/tests/strings/bug29538.phpt
+++ php-src/ext/standard/tests/strings/bug29538.phpt
--TEST--
Bug #29538 (number_format and problem with 0)
--FILE--
<?php
echo number_format(0.25, 2, '', ''), "\n";
echo number_format(1234, 2, '', ',');
?>
--EXPECT--
025
1,23400
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php