【问题标题】:Why does the `FILTER_VALIDATE_NUMBER_FLOAT` constant drop the decimal place character?为什么 `FILTER_VALIDATE_NUMBER_FLOAT` 常量会去掉小数位字符?
【发布时间】:2021-04-06 02:10:36
【问题描述】:
$quantity = filter_input(INPUT_GET, 'quantity', FILTER_SANITIZE_NUMBER_FLOAT);

输入:100.25

输出:10025

如何保留. 字符?

【问题讨论】:

  • 已经回答了。文档是Types of filters。不幸的是,它不是很直观。在这种情况下,需要同时使用 Sanitize 过滤器,并且必须提供 supplementary 过滤器标志(帖子中缺少该标志)。
  • (另外,发布的代码不会乘以 100:它会删除“违规”小数,尝试“100.1234”作为输入 :-)

标签: php


【解决方案1】:

或者,使用FILTER_VALIDATE_FLOAT,如果不匹配,请提供快速反馈:

    $quantity = (filter_input(INPUT_GET, 'quantity', FILTER_VALIDATE_FLOAT))
                ?filter_input(INPUT_GET, 'quantity', FILTER_VALIDATE_FLOAT):
                "Invalid Decimal Number";

    print_r($quantity);

【讨论】:

    【解决方案2】:

    阅读文档http://www.php.net/manual/en/filter.filters.sanitize.php可知FILTER_SANITIZE_NUMBER_FLOAT有如下效果:

    删除除数字、+- 和可选的 .,eE 之外的所有字符。

    把这个格式很差的句子转过来:

    这会从输入中删除除数字 (0-9) 之外的所有字符。使用可选标志,也可以允许字符 . (点) , (逗号) e (指数) 和 E (指数)

    所以,您的代码示例不是相乘,而是去除小数点。

    解决方案

    您需要在函数调用中设置选项FILTER_FLAG_ALLOW_FRACTION 以允许小数点:

    $quantity = filter_input(INPUT_GET, 'quantity', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
    

    【讨论】:

      【解决方案3】:

      你想要:

      $quantity = filter_var(100.25, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
      
      print_r($quantity);
      

      http://codepad.org/ch66qJru

      Woops.. 您仍然希望使用 filter_input,就像您目前拥有的一样,以及相同的前两个参数。我最终使用了filter_var,所以我可以在键盘中测试它并忘记将它改回来:P

      【讨论】:

        【解决方案4】:

        试试这个...

        $quantity = filter_input(
                      INPUT_GET, 
                      'quantity', 
                      FILTER_SANITIZE_NUMBER_FLOAT, 
                      FILTER_FLAG_ALLOW_FRACTION
                    );
        

        CodePad.

        【讨论】:

        • 如果没有FILTER_FLAG_ALLOW_FRACTION,我不明白这个过滤器的意义——“浮动”的定义肯定是它有一个“浮动”点,即十进制?
        • @Andy 我认为原因是... PHP。 :D
        • 我认为你是对的,自从我写了那条评论以来,我已经为其他 PHP 怪异问题挠了几次头 PS:你的网站字体让我想起了老式的点击游戏 :)
        • @Andy 我当时对模拟器很着迷。 :D
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多