Ver Fonte

[ZF-6560, ZF-6561, ZF-6655] Zend_Locale_Format:

- fixed formatting for formats including currency sign

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@15607 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas há 16 anos atrás
pai
commit
81d3a5167d

+ 1 - 1
library/Zend/Currency.php

@@ -149,7 +149,7 @@ class Zend_Currency
         $original = $value;
         $value    = Zend_Locale_Format::toNumber($value, array('locale'        => $locale,
                                                                'number_format' => $format,
-                                                               'precision'     => $options['precision']));
+                                                              'precision'     => $options['precision']));
 
         if ($options['position'] !== self::STANDARD) {
             $value = str_replace('¤', '', $value);

+ 35 - 17
library/Zend/Locale/Format.php

@@ -338,7 +338,12 @@ class Zend_Locale_Format
             $format  = Zend_Locale_Data::getContent($options['locale'], 'decimalnumber');
             if (iconv_strpos($format, ';') !== false) {
                 if (call_user_func(Zend_Locale_Math::$comp, $value, 0, $options['precision']) < 0) {
-                    $format = iconv_substr($format, iconv_strpos($format, ';') + 1);
+                    $tmpformat = iconv_substr($format, iconv_strpos($format, ';') + 1);
+                    if ($tmpformat[0] == '(') {
+                        $format = iconv_substr($format, 0, iconv_strpos($format, ';'));
+                    } else {
+                        $format = $tmpformat;
+                    }
                 } else {
                     $format = iconv_substr($format, 0, iconv_strpos($format, ';'));
                 }
@@ -347,7 +352,12 @@ class Zend_Locale_Format
             // seperate negative format pattern when available
             if (iconv_strpos($format, ';') !== false) {
                 if (call_user_func(Zend_Locale_Math::$comp, $value, 0, $options['precision']) < 0) {
-                    $format = iconv_substr($format, iconv_strpos($format, ';') + 1);
+                    $tmpformat = iconv_substr($format, iconv_strpos($format, ';') + 1);
+                    if ($tmpformat[0] == '(') {
+                        $format = iconv_substr($format, 0, iconv_strpos($format, ';'));
+                    } else {
+                        $format = $tmpformat;
+                    }
                 } else {
                     $format = iconv_substr($format, 0, iconv_strpos($format, ';'));
                 }
@@ -357,13 +367,13 @@ class Zend_Locale_Format
                 if (is_numeric($options['precision'])) {
                     $value = Zend_Locale_Math::round($value, $options['precision']);
                 } else {
-                    if (substr($format, strpos($format, '.') + 1, 3) == '###') {
+                    if (substr($format, iconv_strpos($format, '.') + 1, 3) == '###') {
                         $options['precision'] = null;
                     } else {
-                        $options['precision'] = strlen(substr($format, strpos($format, '.') + 1,
-                                                              strrpos($format, '0') - strpos($format, '.')));
-                        $format = substr($format, 0, strpos($format, '.') + 1) . '###'
-                                . substr($format, strrpos($format, '0') + 1);
+                        $options['precision'] = iconv_strlen(iconv_substr($format, iconv_strpos($format, '.') + 1,
+                                                              iconv_strrpos($format, '0') - iconv_strpos($format, '.')));
+                        $format = iconv_substr($format, 0, iconv_strpos($format, '.') + 1) . '###'
+                                . iconv_substr($format, iconv_strrpos($format, '0') + 1);
                     }
                 }
             } else {
@@ -373,7 +383,7 @@ class Zend_Locale_Format
             $value = Zend_Locale_Math::normalize($value);
         }
 
-        if (strpos($format, '0') === false) {
+        if (iconv_strpos($format, '0') === false) {
             require_once 'Zend/Locale/Exception.php';
             throw new Zend_Locale_Exception('Wrong format... missing 0');
         }
@@ -432,22 +442,30 @@ class Zend_Locale_Format
         $point  = iconv_strpos ($format, '0');
         // Add fraction
         $rest = "";
-        if (($value < 0) && (strpos($format, '.'))) {
-            $rest   = substr(substr($format, strpos($format, '.') + 1), -1, 1);
+        if (iconv_strpos($format, '.')) {
+            $rest   = iconv_substr($format, iconv_strpos($format, '.') + 1);
+            $length = iconv_strlen($rest);
+            for($x = 0; $x < $length; ++$x) {
+                if (($rest[0] == '0') || ($rest[0] == '#')) {
+                    $rest = iconv_substr($rest, 1);
+                }
+            }
+            $format = iconv_substr($format, 0, iconv_strlen($format) - iconv_strlen($rest));
         }
 
         if ($options['precision'] == '0') {
-            $format = iconv_substr($format, 0, $point) . iconv_substr($format, iconv_strrpos($format, '#') + 2);
+            if (iconv_strrpos($format, '-') != 0) {
+                $format = iconv_substr($format, 0, $point)
+                        . iconv_substr($format, iconv_strrpos($format, '#') + 2);
+            } else {
+                $format = iconv_substr($format, 0, $point);
+            }
         } else {
             $format = iconv_substr($format, 0, $point) . $symbols['decimal']
-                               . iconv_substr($prec, 2)
-                               . iconv_substr($format, iconv_strrpos($format, '#') + 1 + strlen($prec));
-        }
-
-        if (($value < 0) and ($rest != '0') and ($rest != '#')) {
-            $format .= $rest;
+                               . iconv_substr($prec, 2);
         }
 
+        $format .= $rest;
         // Add seperation
         if ($group == 0) {
             // no seperation

+ 27 - 0
tests/Zend/CurrencyTest.php

@@ -578,4 +578,31 @@ class Zend_CurrencyTest extends PHPUnit_Framework_TestCase
         Zend_Currency::removeCache();
         $this->assertFalse(Zend_Currency::hasCache());
     }
+
+    /**
+     * @see ZF-6560
+     */
+    public function testPrecisionForCurrency()
+    {
+        $currency = new Zend_Currency(null, 'de_DE');
+
+        $this->assertEquals('75 €', $currency->toCurrency(74.95, array('precision' => 0)));
+        $this->assertEquals('75,0 €', $currency->toCurrency(74.95, array('precision' => 1)));
+        $this->assertEquals('74,95 €', $currency->toCurrency(74.95, array('precision' => 2)));
+        $this->assertEquals('74,950 €', $currency->toCurrency(74.95, array('precision' => 3)));
+        $this->assertEquals('74,9500 €', $currency->toCurrency(74.95, array('precision' => 4)));
+        $this->assertEquals('74,95000 €', $currency->toCurrency(74.95, array('precision' => 5)));
+    }
+
+    /**
+     * @see ZF-6561
+     */
+    public function testNegativeRendering()
+    {
+        $currency = new Zend_Currency(null, 'de_DE');
+        $this->assertEquals('-74,9500 €', $currency->toCurrency(-74.95, array('currency' => 'EUR', 'precision' => 4)));
+
+        $currency = new Zend_Currency(null, 'en_US');
+        $this->assertEquals('-$74.9500', $currency->toCurrency(-74.95, array('currency' => 'USD', 'precision' => 4)));
+    }
 }

+ 3 - 3
tests/Zend/Locale/FormatTest.php

@@ -106,7 +106,7 @@ class Zend_Locale_FormatTest extends PHPUnit_Framework_TestCase
         $this->assertEquals(    '1234567٫12345',   Zend_Locale_Format::toNumber( 1234567.12345,  array('locale' => 'ar_QA')));
         $this->assertEquals(    '1234567٫12345-',  Zend_Locale_Format::toNumber(-1234567.12345,  array('locale' => 'ar_QA')));
         $this->assertEquals(  '12,34,567.12345',   Zend_Locale_Format::toNumber( 1234567.12345,  array('locale' => 'dz_BT')));
-        $this->assertEquals('-(1.234.567,12345)',  Zend_Locale_Format::toNumber(-1234567.12345,  array('locale' => 'mk_MK')));
+        $this->assertEquals(  '-1.234.567,12345',  Zend_Locale_Format::toNumber(-1234567.12345,  array('locale' => 'mk_MK')));
         $this->assertEquals(        '452.25',      Zend_Locale_Format::toNumber(     452.25,     array('locale' => 'en_US')));
         $this->assertEquals(     '54,321.1234',    Zend_Locale_Format::toNumber(   54321.1234,   array('locale' => 'en_US')));
         $this->assertEquals(          '1,23',      Zend_Locale_Format::toNumber(       1.234567, array('locale' => 'de_DE', 'precision' => 2, 'number_format' => '0.00')));
@@ -209,7 +209,7 @@ class Zend_Locale_FormatTest extends PHPUnit_Framework_TestCase
         $this->assertEquals(    '1234567٫12345',  Zend_Locale_Format::toFloat( 1234567.12345, $options                  ));
         $this->assertEquals(    '1234567٫12345-', Zend_Locale_Format::toFloat(-1234567.12345, $options                  ));
         $this->assertEquals(  '12,34,567.12345',  Zend_Locale_Format::toFloat( 1234567.12345, array('locale' => 'dz_BT')));
-        $this->assertEquals('-(1.234.567,12345)', Zend_Locale_Format::toFloat(-1234567.12345, array('locale' => 'mk_MK')));
+        $this->assertEquals(  '-1.234.567,12345', Zend_Locale_Format::toFloat(-1234567.12345, array('locale' => 'mk_MK')));
 
         $options = array('precision' => 2, 'locale' => 'de_AT');
         $this->assertEquals(         '0,00', Zend_Locale_Format::toFloat(       0,         $options));
@@ -296,7 +296,7 @@ class Zend_Locale_FormatTest extends PHPUnit_Framework_TestCase
         $this->assertEquals(    '1234567',  Zend_Locale_Format::toInteger( 1234567.12345,   array('locale' => 'ar_QA')));
         $this->assertEquals(    '1234567-', Zend_Locale_Format::toInteger(-1234567.12345,   array('locale' => 'ar_QA')));
         $this->assertEquals(  '12,34,567',  Zend_Locale_Format::toInteger( 1234567.12345,   array('locale' => 'dz_BT')));
-        $this->assertEquals('-(1.234.567)', Zend_Locale_Format::toInteger(-1234567.12345,   array('locale' => 'mk_MK')));
+        $this->assertEquals(  '-1.234.567', Zend_Locale_Format::toInteger(-1234567.12345,   array('locale' => 'mk_MK')));
 
         $this->assertEquals('-45', Zend_Locale_Format::toInteger(-45.23, $options));
         $this->assertEquals('-46', Zend_Locale_Format::toInteger(-45.99, $options));