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

Reply via email to