我的代码有问题,其中 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 返回结果 FALSE
所以你可以看到 parse 将 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;
}