1

我的代码有问题,其中 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_DIGITSNumberFormatter::FRACTION_DIGITS没有任何效果。附带说明一下,如果有比这更好的方法来比较预期数字的格式和输入的数字的格式,请随时提出比这更好的建议:

if(strcmp(strval($fmt->parse($number)),strval($number)) != 0)
{
    $number = FALSE;
}
4

0 回答 0