为啥 `FILTER_VALIDATE_NUMBER_FLOAT` 常量会去掉小数位字符?

Posted

技术标签:

【中文标题】为啥 `FILTER_VALIDATE_NUMBER_FLOAT` 常量会去掉小数位字符?【英文标题】:Why does the `FILTER_VALIDATE_NUMBER_FLOAT` constant drop the decimal place character?为什么 `FILTER_VALIDATE_NUMBER_FLOAT` 常量会去掉小数位字符? 【发布时间】:2011-05-20 02:13:23 【问题描述】:
$quantity = filter_input(INPUT_GET, 'quantity', FILTER_SANITIZE_NUMBER_FLOAT);

输入:100.25

输出:10025

如何保留. 字符?

【问题讨论】:

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

试试这个...

$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【参考方案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】:

或者,使用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);

【讨论】:

以上是关于为啥 `FILTER_VALIDATE_NUMBER_FLOAT` 常量会去掉小数位字符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?