【问题标题】:Accepting either '.' or ',' as decimal separators when using FILTER_VALIDATE_FLOAT?接受任何一个“。”或使用 FILTER_VALIDATE_FLOAT 时将 ',' 作为小数分隔符?
【发布时间】:2015-05-11 11:24:09
【问题描述】:

我正在使用 PHP filter_input 函数来解析 HTML 表单输入。其中一个输入字段代表金额。我希望我会有一些用户使用逗号和一些使用点作为小数分隔符。 FILTER_VALIDATE_FLOAT 过滤器有一个小数选项,但我还没有想出一个干净的方法来接受这两个字符作为小数分隔符。

目前我的代码类似于以下行,但这不接受像 123.45 这样的金额。

$money = filter_input(INPUT_POST, 'money', FILTER_VALIDATE_FLOAT, array('options' => array('decimal' => ',')));

是否有任何标准/干净的方式来接受多种类型的小数分隔符,而无需编写自定义解析函数?

【问题讨论】:

  • 之前为什么不$_POST['money'] = str_replace(".", ",", $_POST['money'])上线?
  • 这样做会改变 $_POST 数组中的值,但 filter_input 调用仍然返回 false。如果出现验证错误,我的系统会将用户发送回表单,并用之前发布的内容填写。根据您的想法,我的系统将用户发送回表单并用逗号更改他的点(这意味着如果他重新发布相同的数据,它将通过验证)。我不确定为什么 filter_input 仍然失败,即使我之前做了 str_replace。

标签: php


【解决方案1】:

我使用 filter_var 而不是 filter_input 重写了我的代码,并使用了 hd 的 str_replace 技巧。最终结果类似于:

$temp_money = str_replace(".", ",", $_POST['money']);
$money = filter_var($temp_money, FILTER_VALIDATE_FLOAT, array('options' => array('decimal' => ',')));

如果$_POST['money'] 为空,那么$money 也将为空,这与filter_input 的行为相同,因此我的其余验证代码不必更改。

【讨论】:

    【解决方案2】:
    $money = filter_input(INPUT_POST, 'money', FILTER_VALIDATE_FLOAT) || filter_input(INPUT_POST, 'money', FILTER_VALIDATE_FLOAT, array('options' => array('decimal' => ',')));
    

    【讨论】:

    • 这是首选解决方案。干净、清晰且不言自明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    相关资源
    最近更新 更多