Browse Source

add number

euromark 11 years ago
parent
commit
876a2952bd
2 changed files with 69 additions and 136 deletions
  1. 27 76
      src/Utility/Number.php
  2. 42 60
      tests/TestCase/Utility/NumberTest.php

+ 27 - 76
src/Utility/Number.php

@@ -59,7 +59,7 @@ class Number extends CakeNumber {
 	 * @param array $options : currency=true/false, ... (leave empty for no special treatment)
 	 * @return string
 	 */
-	public static function format($number, array $formatOptions = array()) {
+	public static function _format($number, array $formatOptions = array()) {
 		if (!is_numeric($number)) {
 			$default = '---';
 			if (!empty($options['default'])) {
@@ -108,68 +108,41 @@ class Number extends CakeNumber {
 		return $sign . parent::format($number, $options);
 	}
 
-	/**
-	 * Correct the default for European countries
-	 *
-	 * @param mixed $number
-	 * @param string $currency
-	 * @param array $formatOptions
-	 * @return string
-	 */
-	public static function currency($number, $currency = null, array $formatOptions = array()) {
-		if ($currency === null) {
-			$currency = static::$_currency;
-		}
-		$defaults = array();
-		if ($currency !== 'EUR') {
-			//FIXME
-			$default = static::defaultCurrency();
-			//$defaults = static::$_currencies[$currency];
-		} elseif ($currency !== 'EUR' && is_string($currency)) {
-			$defaults['wholeSymbol'] = $currency;
-			$defaults['wholePosition'] = 'before';
-			$defaults['spacer'] = true;
-		}
-		$defaults += array(
-			'wholeSymbol' => '€', 'wholePosition' => 'after',
-			'negative' => '-', 'positive' => '+', 'escape' => true,
-			'decimals' => ',', 'thousands' => '.',
-			'spacer' => $currency === 'EUR' ? true : false
+	public static function format($number, array $options = array()) {
+		$defaults = array(
+			'positive' => '+', 'signed' => false
 		);
-		$options = $formatOptions + $defaults;
-
-		if (!empty($options['spacer'])) {
-			$spacer = is_string($options['spacer']) ? $options['spacer'] : ' ';
-
-			if ($options['wholePosition'] === 'after') {
-				$options['wholeSymbol'] = $spacer . $options['wholeSymbol'];
-			} elseif ($options['wholePosition'] === 'before') {
-				$options['wholeSymbol'] .= $spacer;
-			}
-		}
-
+		$options += $defaults;
 		$sign = '';
 		if ($number > 0 && !empty($options['signed'])) {
-			$sign = $options['positive'];
+			$sign = '+';
+		}
+		if (isset($options['signed'])) {
+			unset($options['signed']);
 		}
-		return $sign . parent::currency($number, null, $options);
+		return $sign . parent::format($number, $options);
 	}
 
 	/**
-	 * Formats a number with a level of precision.
+	 * Overwrite to allow
+	 *
+	 * - signed: true/false
 	 *
-	 * @param float $number	A floating point number.
-	 * @param int $precision The precision of the returned number.
-	 * @param string $decimals
-	 * @return float Formatted float.
-	 * @link http://book.cakephp.org/2.0/en/core-libraries/helpers/number.html#NumberHelper::precision
+	 * @param float $number
+	 * @param string $currency
+	 * @param array $options
+	 * @return string
 	 */
-	public static function precision($number, $precision = 3, $decimals = '.') {
-		$number = parent::precision($number, $precision);
-		if ($decimals !== '.' && $precision > 0) {
-			$number = str_replace('.', $decimals, $number);
+	public static function currency($number, $currency = null, array $options = array()) {
+		$defaults = array(
+			'positive' => '+', 'signed' => false
+		);
+		$options += $defaults;
+		$sign = '';
+		if ($number > 0 && !empty($options['signed'])) {
+			$sign = $options['positive'];
 		}
-		return $number;
+		return $sign . parent::currency($number, $currency, $options);
 	}
 
 	/**
@@ -179,7 +152,7 @@ class Number extends CakeNumber {
 	 * @return string Human readable size
 	 * @link http://book.cakephp.org/2.0/en/core-libraries/helpers/number.html#NumberHelper::toReadableSize
 	 */
-	public static function toReadableSize($size, $decimals = '.') {
+	public static function _toReadableSize($size, $decimals = '.') {
 		$size = parent::toReadableSize($size);
 		if ($decimals !== '.') {
 			$size = str_replace('.', $decimals, $size);
@@ -188,28 +161,6 @@ class Number extends CakeNumber {
 	}
 
 	/**
-	 * Formats a number into a percentage string.
-	 *
-	 * Options:
-	 *
-	 * - `multiply`: Multiply the input value by 100 for decimal percentages.
-	 * - `decimals`: Decimal character.
-	 *
-	 * @param float $number A floating point number
-	 * @param int $precision The precision of the returned number
-	 * @param string $decimals
-	 * @return string Percentage string
-	 * @link http://book.cakephp.org/2.0/en/core-libraries/helpers/number.html#NumberHelper::toPercentage
-	 */
-	public static function toPercentage($number, $precision = 2, array $options = array()) {
-		$options += array('multiply' => false, 'decimals' => '.');
-		if ($options['multiply']) {
-			$number *= 100;
-		}
-		return static::precision($number, $precision, $options['decimals']) . '%';
-	}
-
-	/**
 	 * Get the rounded average.
 	 *
 	 * @param array $values: int or float values

+ 42 - 60
tests/TestCase/Utility/NumberTest.php

@@ -5,6 +5,7 @@ namespace Tools\TestCase\Utility;
 use Tools\Utility\Number;
 use Cake\TestSuite\TestCase;
 use Cake\Core\Configure;
+use Cake\I18n\I18n;
 
 class NumberTest extends TestCase {
 
@@ -13,11 +14,7 @@ class NumberTest extends TestCase {
 	public function setUp() {
 		parent::setUp();
 
-		Configure::write('Localization', array(
-			'decimals' => ',',
-			'thousands' => '.'
-		));
-		Number::config();
+		Number::defaultCurrency(false);
 	}
 
 	/**
@@ -58,16 +55,21 @@ class NumberTest extends TestCase {
 	 * @return void
 	 */
 	public function testMoney() {
-		$is = Number::money(22.11);
-		$expected = '22,11 €';
+		Number::defaultCurrency('EUR');
+
+		$is = Number::money(22.11, ['locale' => 'DE']);
+		$expected = '22,11 €';
+
 		$this->assertSame($expected, $is);
 
-		$is = Number::money(-22.11);
-		$expected = '-22,11 €';
+		$is = Number::money(-22.11, ['locale' => 'DE']);
+		//$expected = '-22,11 €';
+		$expected = '-22,11 €';
+		//file_put_contents(TMP . 'x.txt', $is);
 		$this->assertSame($expected, $is);
 
-		$is = Number::money(-22.11);
-		$expected = '0,00 €';
+		$is = Number::money(0, ['locale' => 'DE']);
+		$expected = '0,00 €';
 		$this->assertSame($expected, $is);
 	}
 
@@ -77,21 +79,31 @@ class NumberTest extends TestCase {
 	 * @return void
 	 */
 	public function testCurrency() {
+		Number::defaultCurrency('EUR');
+
 		$is = Number::currency(22.11);
-		$expected = '22,11 €';
+		$expected = '22,11 €';
+		$this->assertSame($expected, $is);
+
+		$is = Number::currency(22.11, null, ['useIntlCode' => true]);
+		$expected = '22,11 EUR';
 		$this->assertSame($expected, $is);
 
 		$is = Number::currency(-22.11);
-		$expected = '-22,11 €';
+		$expected = '-22,11 €';
 		$this->assertSame($expected, $is);
 
-		$is = Number::currency(-22.11, 'EUR', array('signed' => true));
-		$expected = '-22,11 €';
+		$is = Number::currency(-22.11, null, ['signed' => true]);
+		$expected = '-22,11 €';
 		$this->assertSame($expected, $is);
 
-		$is = Number::currency(22.11, 'EUR', array('signed' => true));
-		$expected = '+22,11 €';
+		$is = Number::currency(22.11, null, ['signed' => true]);
+		$expected = '+22,11 €';
 		$this->assertSame($expected, $is);
+
+		$result = Number::currency('4.111', 'GBP', ['locale' => 'EN', 'useIntlCode' => true]);
+		$expected = 'GBP 4.11';
+		$this->assertEquals($expected, $result);
 	}
 
 	/**
@@ -105,10 +117,14 @@ class NumberTest extends TestCase {
 		$this->assertSame($expected, $is);
 
 		$is = Number::format(22933773);
+		$expected = '22.933.773';
+		$this->assertSame($expected, $is);
+
+		$is = Number::format(22933773, ['places' => 2]);
 		$expected = '22.933.773,00';
 		$this->assertSame($expected, $is);
 
-		$is = Number::format(-0.895, array('places' => 3));
+		$is = Number::format(-0.895, ['places' => 3]);
 		$expected = '-0,895';
 		$this->assertSame($expected, $is);
 	}
@@ -118,11 +134,11 @@ class NumberTest extends TestCase {
 	 */
 	public function testToPercentage() {
 		$is = Number::toPercentage(22.11, 2, array('decimals' => '.'));
-		$expected = '22.11%';
+		$expected = '22,11%';
 		$this->assertSame($expected, $is);
 
-		$is = Number::toPercentage(22.11, 2, array('decimals' => ','));
-		$expected = '22,11%';
+		$is = Number::toPercentage(22.11, 2, array('locale' => 'en'));
+		$expected = '22.11%';
 		$this->assertSame($expected, $is);
 
 		$is = Number::toPercentage(22.11, 0, array('decimals' => '.'));
@@ -167,6 +183,7 @@ class NumberTest extends TestCase {
 	}
 
 	/**
+	 * @return void
 	 */
 	public function testRoundUpTo() {
 		//increment = 10
@@ -198,6 +215,7 @@ class NumberTest extends TestCase {
 	}
 
 	/**
+	 * @return void
 	 */
 	public function testRoundDownTo() {
 		//increment = 10
@@ -246,50 +264,14 @@ class NumberTest extends TestCase {
 	}
 
 	/**
-	 * Test spacer format options for currency() method
-	 *
-	 * @return void
-	 */
-	public function testCurrencySpacer() {
-		if ((float)Configure::version() < 2.4) {
-			$format = Number::getFormat('GBP');
-			$format['wholeSymbol'] = '£';
-			Number::addFormat('GBP', $format);
-		}
-
-		$result = Number::currency('4.111', 'GBP');
-		$expected = '£4.11';
-		$this->assertEquals($expected, $result);
-
-		$result = Number::currency('4.111', 'GBP', array('spacer' => false));
-		$expected = '£4.11';
-		$this->assertEquals($expected, $result);
-
-		$result = Number::currency('4.111', 'GBP', array('spacer' => true));
-		$expected = '£ 4.11';
-		$this->assertEquals($expected, $result);
-
-		$result = Number::currency('-4.111', 'GBP', array('spacer' => false, 'negative' => '-'));
-		$expected = '-£4.11';
-		$this->assertEquals($expected, $result);
-
-		$result = Number::currency('-4.111', 'GBP', array('spacer' => true, 'negative' => '-'));
-		$expected = '-£ 4.11';
-		$this->assertEquals($expected, $result);
-
-		$result = Number::currency('4.111', 'GBP', array('spacer' => '&nbsp;', 'escape' => false));
-		$expected = '£&nbsp;4.11';
-		$this->assertEquals($expected, $result);
-	}
-
-	/**
 	 * NumberTest::testCurrencyUnknown()
 	 *
 	 * @return void
 	 */
 	public function testCurrencyUnknown() {
-		$result = Number::currency('4.111', 'XYZ');
-		$expected = 'XYZ 4,11';
+		$result = Number::currency('4.111', 'XYZ', ['locale' => 'DE']);
+		$expected = '4,11 XYZ';
+		file_put_contents(TMP . 'x.txt', $result);
 		$this->assertEquals($expected, $result);
 	}