/**
  * Checks if the given value is a valid number.
  *
  * @param mixed $value The value that should be validated
  * @return void
  * @api
  * @todo Currency support should be added when it will be supported by NumberParser
  */
 protected function isValid($value)
 {
     if (!isset($this->options['locale'])) {
         $locale = $this->localizationService->getConfiguration()->getDefaultLocale();
     } elseif (is_string($this->options['locale'])) {
         $locale = new \TYPO3\Flow\I18n\Locale($this->options['locale']);
     } elseif ($this->options['locale'] instanceof \TYPO3\Flow\I18n\Locale) {
         $locale = $this->options['locale'];
     } else {
         $this->addError('The "locale" option can be only set to string identifier, or Locale object.', 1281286579);
         return;
     }
     $strictMode = $this->options['strictMode'];
     $formatLength = $this->options['formatLength'];
     \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::validateFormatLength($formatLength);
     $formatType = $this->options['formatType'];
     \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::validateFormatType($formatType);
     if ($formatType === \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::FORMAT_TYPE_PERCENT) {
         if ($this->numberParser->parsePercentNumber($value, $locale, $formatLength, $strictMode) === false) {
             $this->addError('A valid percent number is expected.', 1281452093);
         }
         return;
     } else {
         if ($this->numberParser->parseDecimalNumber($value, $locale, $formatLength, $strictMode) === false) {
             $this->addError('A valid decimal number is expected.', 1281452094);
         }
     }
 }
 /**
  * Parses percent number using proper format from CLDR.
  *
  * @param string $numberToParse Number to be parsed
  * @param \TYPO3\Flow\I18n\Locale $locale Locale to use
  * @param string $formatLength One of NumbersReader FORMAT_LENGTH constants
  * @param boolean $strictMode Work mode (strict when TRUE, lenient when FALSE)
  * @return mixed Parsed float number or FALSE on failure
  * @api
  */
 public function parsePercentNumber($numberToParse, \TYPO3\Flow\I18n\Locale $locale, $formatLength = \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::FORMAT_LENGTH_DEFAULT, $strictMode = true)
 {
     \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::validateFormatLength($formatLength);
     return $this->doParsingWithParsedFormat($numberToParse, $this->numbersReader->parseFormatFromCldr($locale, \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::FORMAT_TYPE_PERCENT, $formatLength), $this->numbersReader->getLocalizedSymbolsForLocale($locale), $strictMode);
 }
 /**
  * Formats number with format string for currency defined in CLDR for
  * particular locale.
  *
  * Currency symbol provided will be inserted into formatted number string.
  *
  * Note: currently length is not used in currencyFormats from CLDR.
  * But it's defined in the specification, so we support it here.
  *
  * @param mixed $number Float or int, can be negative, can be NaN or infinite
  * @param \TYPO3\Flow\I18n\Locale $locale
  * @param string $currency Currency symbol (or name)
  * @param string $formatLength One of NumbersReader FORMAT_LENGTH constants
  * @return string Formatted number. Will return string-casted version of $number if there is no pattern for given $locale / $formatLength
  * @api
  */
 public function formatCurrencyNumber($number, \TYPO3\Flow\I18n\Locale $locale, $currency, $formatLength = \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::FORMAT_LENGTH_DEFAULT)
 {
     \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::validateFormatLength($formatLength);
     return $this->doFormattingWithParsedFormat($number, $this->numbersReader->parseFormatFromCldr($locale, \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::FORMAT_TYPE_CURRENCY, $formatLength), $this->numbersReader->getLocalizedSymbolsForLocale($locale), $currency);
 }
Esempio n. 4
0
 /**
  * Tries to parse the input using the NumberParser.
  *
  * @param string $source
  * @param \TYPO3\Flow\Property\PropertyMappingConfigurationInterface $configuration
  * @return float|\TYPO3\Flow\Validation\Error Parsed float number or error
  * @throws \TYPO3\Flow\Property\Exception\InvalidPropertyMappingConfigurationException
  */
 protected function parseUsingLocaleIfConfigured($source, \TYPO3\Flow\Property\PropertyMappingConfigurationInterface $configuration)
 {
     $configuration = $this->getConfigurationKeysAndValues($configuration, array('locale', 'strictMode', 'formatLength', 'formatType'));
     if ($configuration['locale'] === NULL) {
         return $source;
     } elseif ($configuration['locale'] === TRUE) {
         $locale = $this->localizationService->getConfiguration()->getCurrentLocale();
     } elseif (is_string($configuration['locale'])) {
         $locale = new \TYPO3\Flow\I18n\Locale($configuration['locale']);
     } elseif ($configuration['locale'] instanceof \TYPO3\Flow\I18n\Locale) {
         $locale = $configuration['locale'];
     }
     if (!$locale instanceof \TYPO3\Flow\I18n\Locale) {
         $exceptionMessage = 'Determined locale is not of type "\\TYPO3\\Flow\\I18n\\Locale", but of type "' . (is_object($locale) ? get_class($locale) : gettype($locale)) . '".';
         throw new InvalidPropertyMappingConfigurationException($exceptionMessage, 1334837413);
     }
     if ($configuration['strictMode'] === NULL || $configuration['strictMode'] === TRUE) {
         $strictMode = TRUE;
     } else {
         $strictMode = FALSE;
     }
     if ($configuration['formatLength'] !== NULL) {
         $formatLength = $configuration['formatLength'];
         NumbersReader::validateFormatLength($formatLength);
     } else {
         $formatLength = NumbersReader::FORMAT_LENGTH_DEFAULT;
     }
     if ($configuration['formatType'] !== NULL) {
         $formatType = $configuration['formatType'];
         \TYPO3\Flow\I18n\Cldr\Reader\NumbersReader::validateFormatType($formatType);
     } else {
         $formatType = NumbersReader::FORMAT_TYPE_DECIMAL;
     }
     if ($formatType === NumbersReader::FORMAT_TYPE_PERCENT) {
         $return = $this->numberParser->parsePercentNumber($source, $locale, $formatLength, $strictMode);
         if ($return === FALSE) {
             $return = new Error('A valid percent number is expected.', 1334839253);
         }
     } else {
         $return = $this->numberParser->parseDecimalNumber($source, $locale, $formatLength, $strictMode);
         if ($return === FALSE) {
             $return = new Error('A valid decimal number is expected.', 1334839260);
         }
     }
     return $return;
 }