У меня проблема с моим кодом, где NumberFormatter :: parse () усекает десятичные дроби, когда есть конечный ноль. Наше приложение использует Intl, чтобы быть в курсе локали, поэтому я выполняю вызов JSON API, чтобы убедиться, что число, введенное в форму, действительно является числом. Например, когда локаль вызывает запятую в качестве десятичного разделителя, возвращайте FALSE для чисел, введенных с точкой.
function parse_decimals($number)
{
// ignore empty strings and return
if(empty($number))
{
return $number;
}
$config = get_instance()->config;
$fmt = new \NumberFormatter( $config->item('number_locale'), \NumberFormatter::DECIMAL);
$fmt->format(1234567890.12300);
if (empty($config->item('thousands_separator')))
{
$fmt->setAttribute(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '');
}
try
{
if(strcmp(strval($fmt->parse($number)),strval($number)) != 0)
{
$number = FALSE;
}
return $fmt->parse($number);
}
catch (Exception $e)
{
return FALSE;
}
}
Локаль не имеет значения (потому что она счастлива со всеми локалями, поэтому для аргумента Intl используется для установки локали на en_US.
Введено 50.00
Ожидаемое 50,00
Актуальные 50
Вернуть результат ЛОЖЬ
Итак, вы можете видеть, что синтаксический анализ усекает 50,00 до 50. Я попытался поиграть с NumberFormatter::MAX_FRACTION_DIGITS
, NumberFormatter::MIN_FRACTION_DIGITS
а также NumberFormatter::FRACTION_DIGITS
без какого-либо эффекта. Примечание: если есть лучший способ сравнить формат ожидаемого числа с форматом введенного числа, чем этот, пожалуйста, не стесняйтесь предложить что-то лучшее, чем это:
if(strcmp(strval($fmt->parse($number)),strval($number)) != 0)
{
$number = FALSE;
}
Задача ещё не решена.
Других решений пока нет …