/** * 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 I18n\Locale($this->options['locale']); } elseif ($this->options['locale'] instanceof 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']; NumbersReader::validateFormatLength($formatLength); $formatType = $this->options['formatType']; NumbersReader::validateFormatType($formatType); if ($formatType === 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); } } }
/** * Tries to parse the input using the NumberParser. * * @param string $source * @param PropertyMappingConfigurationInterface $configuration * @return float|\Neos\Flow\Validation\Error Parsed float number or error * @throws \Neos\Flow\Property\Exception\InvalidPropertyMappingConfigurationException */ protected function parseUsingLocaleIfConfigured($source, PropertyMappingConfigurationInterface $configuration) { $configuration = $this->getConfigurationKeysAndValues($configuration, ['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 Locale($configuration['locale']); } elseif ($configuration['locale'] instanceof Locale) { $locale = $configuration['locale']; } if (!$locale instanceof Locale) { $exceptionMessage = 'Determined locale is not of type "\\Neos\\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']; 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; }
/** * @test * @dataProvider sampleNumbersEasyToParse */ public function specificFormattingMethodsWork($formatType, $numberToParse, $expectedParsedNumber, $stringFormat, array $parsedFormat) { $mockNumbersReader = $this->createMock(I18n\Cldr\Reader\NumbersReader::class); $mockNumbersReader->expects($this->once())->method('parseFormatFromCldr')->with($this->sampleLocale, $formatType, I18n\Cldr\Reader\NumbersReader::FORMAT_LENGTH_DEFAULT)->will($this->returnValue($parsedFormat)); $mockNumbersReader->expects($this->once())->method('getLocalizedSymbolsForLocale')->with($this->sampleLocale)->will($this->returnValue($this->sampleLocalizedSymbols)); $formatter = new I18n\Parser\NumberParser(); $formatter->injectNumbersReader($mockNumbersReader); $methodName = 'parse' . ucfirst($formatType) . 'Number'; $result = $formatter->{$methodName}($numberToParse, $this->sampleLocale); $this->assertEquals($expectedParsedNumber, $result); }