为什么`FILTER_VALIDATE_NUMBER_FLOAT`常量会丢弃小数位字符?

Mon*_*ica 29 php

$quantity = filter_input(INPUT_GET, 'quantity', FILTER_SANITIZE_NUMBER_FLOAT);
Run Code Online (Sandbox Code Playgroud)

输入: 100.25

输出: 10025

我该如何保留.角色?

ale*_*lex 49

试试这个...

$quantity = filter_input(
              INPUT_GET, 
              'quantity', 
              FILTER_SANITIZE_NUMBER_FLOAT, 
              FILTER_FLAG_ALLOW_FRACTION
            );
Run Code Online (Sandbox Code Playgroud)

CodePad.

  • 我不明白这个过滤器没有`FILTER_FLAG_ALLOW_FRACTION`的意思 - 当然"浮动"的定义是它有一个"浮动"点,即十进制? (10认同)
  • @Andy我认为原因是... PHP。:D (2认同)

Hor*_*Kol 19

阅读文档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);
Run Code Online (Sandbox Code Playgroud)


Dem*_*cht 8

你要:

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

print_r($quantity);
Run Code Online (Sandbox Code Playgroud)

http://codepad.org/ch66qJru

Woops ..你仍然希望仍然使用filter_input你现在拥有的以及相同的前两个args.我最终使用,filter_var所以我可以在键盘中测试它,忘了改回来:P