protected function doParsingInStrictMode($numberToParse, array $parsedFormat, array $localizedSymbols)
{
$numberIsNegative = false;
if (!empty($parsedFormat['negativePrefix']) && !empty($parsedFormat['negativeSuffix'])) {
if (Utility::stringBeginsWith($numberToParse, $parsedFormat['negativePrefix']) && Utility::stringEndsWith($numberToParse, $parsedFormat['negativeSuffix'])) {
$numberToParse = substr($numberToParse, strlen($parsedFormat['negativePrefix']), -strlen($parsedFormat['negativeSuffix']));
$numberIsNegative = true;
}
} elseif (!empty($parsedFormat['negativePrefix']) && Utility::stringBeginsWith($numberToParse, $parsedFormat['negativePrefix'])) {
$numberToParse = substr($numberToParse, strlen($parsedFormat['negativePrefix']));
$numberIsNegative = true;
} elseif (!empty($parsedFormat['negativeSuffix']) && Utility::stringEndsWith($numberToParse, $parsedFormat['negativeSuffix'])) {
$numberToParse = substr($numberToParse, 0, -strlen($parsedFormat['negativeSuffix']));
$numberIsNegative = true;
}
if (!$numberIsNegative) {
if (!empty($parsedFormat['positivePrefix']) && !empty($parsedFormat['positiveSuffix'])) {
if (Utility::stringBeginsWith($numberToParse, $parsedFormat['positivePrefix']) && Utility::stringEndsWith($numberToParse, $parsedFormat['positiveSuffix'])) {
$numberToParse = substr($numberToParse, strlen($parsedFormat['positivePrefix']), -strlen($parsedFormat['positiveSuffix']));
} else {
return false;
}
} elseif (!empty($parsedFormat['positivePrefix'])) {
if (Utility::stringBeginsWith($numberToParse, $parsedFormat['positivePrefix'])) {
$numberToParse = substr($numberToParse, strlen($parsedFormat['positivePrefix']));
} else {
return false;
}
} elseif (!empty($parsedFormat['positiveSuffix'])) {
if (Utility::stringEndsWith($numberToParse, $parsedFormat['positiveSuffix'])) {
$numberToParse = substr($numberToParse, 0, -strlen($parsedFormat['positiveSuffix']));
} else {
return false;
}
}
}
$positionOfDecimalSeparator = strpos($numberToParse, $localizedSymbols['decimal']);
if ($positionOfDecimalSeparator === false) {
$numberToParse = str_replace($localizedSymbols['group'], '', $numberToParse);
if (strlen($numberToParse) < $parsedFormat['minIntegerDigits']) {
return false;
} elseif (preg_match(self::PATTERN_MATCH_DIGITS, $numberToParse, $matches) !== 1) {
return false;
}
$integerPart = $numberToParse;
$decimalPart = false;
} else {
if ($positionOfDecimalSeparator === 0 && $positionOfDecimalSeparator === strlen($numberToParse) - 1) {
return false;
}
$numberToParse = str_replace([$localizedSymbols['group'], $localizedSymbols['decimal']], ['', '.'], $numberToParse);
$positionOfDecimalSeparator = strpos($numberToParse, '.');
$integerPart = substr($numberToParse, 0, $positionOfDecimalSeparator);
$decimalPart = substr($numberToParse, $positionOfDecimalSeparator + 1);
}
if (strlen($integerPart) < $parsedFormat['minIntegerDigits']) {
return false;
} elseif (preg_match(self::PATTERN_MATCH_DIGITS, $integerPart, $matches) !== 1) {
return false;
}
$parsedNumber = (int) $integerPart;
if ($decimalPart !== false) {
$countOfDecimalDigits = strlen($decimalPart);
if ($countOfDecimalDigits < $parsedFormat['minDecimalDigits'] || $countOfDecimalDigits > $parsedFormat['maxDecimalDigits']) {
return false;
} elseif (preg_match(self::PATTERN_MATCH_DIGITS, $decimalPart, $matches) !== 1) {
return false;
}
$parsedNumber = (double) ($integerPart . '.' . $decimalPart);
}
$parsedNumber /= $parsedFormat['multiplier'];
if ($parsedFormat['rounding'] !== 0.0 && $parsedNumber - (int) ($parsedNumber / $parsedFormat['rounding']) * $parsedFormat['rounding'] !== 0.0) {
return false;
}
if ($numberIsNegative) {
$parsedNumber = 0 - $parsedNumber;
}
return $parsedNumber;
}