Exemple #1
0
 public function testFloatPrecision()
 {
     $locale = 'en_US';
     $currencyCode = 'EUR';
     $currency = new Currency($locale, $currencyCode);
     $uncurrency = new Uncurrency($locale, $currencyCode);
     $from = -100;
     $to = $from + 1100;
     $precision = 2;
     $divisor = pow(10, $precision);
     for ($i = $from; $i <= $to; $i++) {
         $testValue = (double) $i / $divisor;
         $stringValue = $currency->filter($testValue);
         $value = $uncurrency->filter($stringValue);
         // echo $testValue . ' -> ' . $stringValue . ' -> ' . $value . PHP_EOL; // DEBUG
         $this->assertInternalType('string', $stringValue);
         $this->assertInternalType('double', $value);
         $this->assertSame($testValue, $value);
     }
     $from = 100000000000000.0;
     $to = $from + 1000;
     $precision = 2;
     $divisor = pow(10, $precision);
     for ($i = $from; $i <= $to; $i++) {
         $testValue = (double) $i / $divisor;
         $stringValue = $currency->filter($testValue);
         $value = $uncurrency->filter($stringValue);
         // echo $testValue . ' -> ' . $stringValue . ' -> ' . $value . PHP_EOL; // DEBUG
         $this->assertInternalType('string', $stringValue);
         $this->assertInternalType('double', $value);
         $this->assertSame($testValue, $value);
     }
 }
 public function testFilter()
 {
     // (1) italian - italy
     // (2) default currency code for it_IT
     // (3) correctness of fraction digits not mandatory
     // (4) correctness (and presence) of currency not mandatory
     // (5) breaking spaces allowed
     $filter = new Uncurrency('it_IT', null);
     $filter->setScaleCorrectness(false);
     $filter->setCurrencyCorrectness(false);
     $filter->setBreakingSpaceAllowed(true);
     $formatter = $filter->getFormatter();
     // ALLOWED //
     $this->assertSame((double) 123, $filter->filter($formatter->format((double) 123)));
     // 123 €
     $this->assertSame(1234.61, $filter->filter($formatter->format(1234.61)));
     // 1.234,61 €
     // pattern correct, fraction digit correct, currency absence
     $this->assertSame(1234.61, $filter->filter('1.234,61'));
     // pattern not correct (no grouping separator), fraction digit correct, currency absence
     $this->assertSame(1234.61, $filter->filter('1234,61'));
     // pattern not correct (no grouping separator), fraction digit correct, currency code as currency
     if (version_compare($GLOBALS['INTL_ICU_VERSION'], '4.8.1.1') > 0) {
         $this->assertSame(1234.61, $filter->filter('1234,61 EUR'));
     }
     // pattern correct, fraction digit correct, display name as currency
     $this->assertSame(1234.61, $filter->filter('1.234,61 EURO'));
     // pattern not correct (no grouping separator), fraction digit correct, display name as currency
     $this->assertSame(1234.61, $filter->filter('1234,61 EURO'));
     // wrong number of decimals, currency absence
     $this->assertSame(1234.619, $filter->filter('1234,619'));
     // wrong number of decimals, currency
     $this->assertSame(1234.619, $filter->filter('1234,619 €'));
     // negative
     $this->assertSame((double) -2.5, $filter->filter($formatter->format((double) -2.5)));
     // -2,50 €
     // negative, pattern not correct (currecny symbol without prefixing space)
     $this->assertSame(-0.01, $filter->filter('-0,01€'));
     // negative, currecny absence
     $this->assertSame(-0.5, $filter->filter('-0,5'));
     // NOT ALLOWED //
     // not existent display name
     $this->assertSame('1234,61 EUROOO', $filter->filter('1234,61 EUROOO'));
     // exponential notation
     $this->assertSame('1E-2 €', $filter->filter('1E-2 €'));
     // (3) correct number of decimal places will now be mandatory
     $filter->setScaleCorrectness(true);
     // NO MORE ALLOWED //
     $this->assertSame('1.234,619 €', $filter->filter('1.234,619 €'));
     $this->assertSame('1.234,619', $filter->filter('1.234,619'));
     $this->assertSame('1.234,1 €', $filter->filter('1.234,1 €'));
     // ALLOWED //
     $this->assertSame(1234.1, $filter->filter('1.234,10 €'));
     // (4) currency correctness (and so its presence) will no be mandatory
     $filter->setCurrencyCorrectness(true);
     // NO MORE ALLOWED //
     // currency absence
     $this->assertSame('1234,61', $filter->filter('1234,61'));
     // currency pattern part malformed (no prefixing space)
     $this->assertSame('1234,61€', $filter->filter('1234,61€'));
     // ALLOWED //
     $this->assertSame(1234.61, $filter->filter($formatter->format(1234.61)));
     // 1234,61 €
     $this->assertSame(-0.01, $filter->filter($formatter->format(-0.01)));
     // -0,01 €
     // (1) bengali - bangladesh
     // (2) default currency code
     // (2) correct number of decimal places not mandatory
     // (3) currency not mandatory
     $filter = new Uncurrency('bn_BD', null);
     $filter->setScaleCorrectness(false);
     $filter->setCurrencyCorrectness(false);
     $formatter = $filter->getFormatter();
     // Allowed
     $this->assertSame((double) 0, $filter->filter($formatter->format((double) 0)));
     // '০.০০৳' (w/ currency symbol)
     $this->assertSame((double) 0, $filter->filter('০.০'));
     $this->assertSame(0.01, $filter->filter($formatter->format(0.01)));
     // '০.০১৳' (w/ currency symbol)
     $this->assertSame(0.01, $filter->filter('০.০১০'));
     // $this->assertSame((float) 0, $filter->filter('(০.০)')); // FIXME? negative zero allowed
     $this->assertSame(-0.01, $filter->filter($formatter->format(-0.01)));
     // (০.০১৳) (w/ currency symbol)
     $this->assertSame(-0.01, $filter->filter('(০.০১)'));
 }
 /**
  * @param $locale
  * @param $fractionDigitsMandatory
  * @param $currencySymbolMandatory
  * @param $expected
  * @param $value
  * @dataProvider valuesProvider
  */
 public function testAllValues($locale, $fractionDigitsMandatory, $currencySymbolMandatory, $expected, $value)
 {
     $filter = new UncurrencyFilter($locale, $fractionDigitsMandatory, $currencySymbolMandatory);
     $this->assertEquals($expected, $filter->filter($value));
     self::writeData(['locale' => $locale, 'fraction_digits' => $fractionDigitsMandatory ? 'Y' : 'N', 'currency_symbol' => $currencySymbolMandatory ? 'Y' : 'N', 'currency' => $value, 'expected' => $expected, 'filtered' => $value === $expected ? 'N' : 'Y']);
 }
Exemple #4
0
 /**
  * Returns true if and only if $value is a currency amount well-formatted for the given locale
  *
  * It validates according to the specified options, i.e. whether to consider valid:
  * a negative currency amount,
  * a currency different than the locale's default,
  * a currency string that could not contain currency symbol,
  * a currency string that could contain an inexact number of decimal places.
  *
  * @param  string $value
  * @return bool
  * @throws I18nException\InvalidArgumentException
  */
 public function isValid($value)
 {
     $this->setValue($value);
     if (!is_string($value)) {
         $this->error(self::INVALID);
         return false;
     }
     // Setup filter
     $filter = new Uncurrency($this->getLocale(), $this->getCurrencyCode());
     $filter->setScaleCorrectness($this->getScaleCorrectness());
     $filter->setCurrencyCorrectness($this->getCurrencyCorrectness());
     $filter->setBreakingSpaceAllowed($this->isBreakingSpaceAllowed());
     // Filtering
     $result = $filter->filter($this->getValue());
     // Retrieve updated currency code
     $this->currencyCode = $filter->getCurrencyCode();
     if ($result !== $this->getValue()) {
         // Filter succedeed
         if (!$this->isNegativeAllowed() && $result < 0) {
             $this->error(self::NOT_POSITIVE);
             return false;
         }
         return true;
     }
     $this->pattern = $filter->getFormatter()->getPattern();
     $this->error(self::NOT_CURRENCY);
     return false;
 }