为啥 `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,为啥它受到保护?