【问题标题】:str_replace not doing what I need it tostr_replace 没有做我需要做的事
【发布时间】:2017-08-01 10:05:46
【问题描述】:

我有一个在提交前使用 jQuery 计算总数的表单。它将总数与货币符号一起发送到表单处理脚本。这正在产生一些

警告:遇到非数字值

消息,所以我一直在使用str_replace。但是,以下代码仍在生成错误。除了这段代码之外,它在其他任何地方都可以使用,我找不到解决方案。任何人都可以提供一些建议。

function netprice() {
    $vatrate = 1.2;
    $gross = str_replace('£','',$_POST['unit_Price']);
    $net = round(($gross / $vatrate) , 2);

    if (empty($gross)) {
        echo"-";
    }else{
        echo $net;
    }
}

【问题讨论】:

  • $_POST['unit_Price'] 包含什么? var_dump() 给我们看。
  • 嗨奇瑞尔。 var_dump 显示这个字符串(0) ""
  • 这意味着传递给 PHP 的表单中没有对应的 <input name="unit_Price">(注意大小写)。此外,您应该使用 intval() 将变量显式类型转换为整数,以避免将来出现混淆。

标签: php


【解决方案1】:

您可以使用preg_replace,而不是使用可能会留下空格或其他字符的preg_replace,如示例中的Remove non-numeric characters (except periods and commas) from a string

您的代码将如下所示:

function netprice() {

$vatrate = 1.2;

$gross = preg_replace("/[^0-9,.]/", "", $_POST['unit_Price']);
$net = round(($gross / $vatrate) , 2);

    if (empty($gross)) {

        echo"-";

    }else{

        echo $net;
    }
}

preg_replace 将删除除第一个参数中定义的字符之外的所有字符。

【讨论】:

    【解决方案2】:

    您可以使用filter_var 函数从字符串中仅获取数字。

    $gross = filter_var($_POST['unit_Price'], FILTER_SANITIZE_NUMBER_INT);
    

    如果你想获得浮动使用:

    $gross = filter_var($_POST['unit_Price'], FILTER_SANITIZE_NUMBER_FLOAT);
    

    【讨论】:

    • 这是一个很好的解决方案,但是如果它是浮点数而不是整数呢?
    • 这不会按预期工作,因为价格值可以是浮动的。例如$gross = filter_var('£1.2', FILTER_SANITIZE_NUMBER_INT); 将返回 (string)12
    • @Qirel 将此添加到答案中
    • 为这位伙伴干杯。直到为时已晚,我才看到您对 float 的答案,否则这将是我选择的答案。
    【解决方案3】:

    您真的不应该在表单中发送货币符号。如果无法避免,则符号和数字之间可能还有其他字符,例如空格。 首先,您可以尝试像这样通过 floatval() 传递结果值:

    $gross = floatval(str_replace('£','',$_POST['unit_Price']));
    

    如果仍然不起作用,请改用正则表达式来去除除数字、逗号和点之外的所有字符:

    $gross = floatval(preg_replace('/[^0-9,.]/', '', $_POST['unit_Price']));
    

    【讨论】:

    • 这是很重要的一点。货币不应由客户端决定。
    • 这成功了。谢谢你的佩卡。并感谢大家的所有建议。非常感谢:)
    • 不客气。根据 Yaroslav Molchan 的回答,您还应该考虑使用 filter_var() 来获取 $_POST 值,而不是直接访问它。使用原始表单输入可能是一个漏洞。
    • 会的。再次感谢好友。
    【解决方案4】:

    如果你的货币符号在值之前,你可以使用 substr:

    <?php
    $price = substr('£1.2', 2); //1.2
    

    请注意,由于 £ 符号是一个特殊字符,因此您必须减去 2 个第一个字符。您可以通过执行 var_dump 来检查它

    如果您的货币符号在末尾,您可以简单地将 de value 强制为浮动:

    $price = (float)'1.2£'; //1.2
    

    【讨论】:

      【解决方案5】:

      £ 更改为&amp;#163;

      还要检查您的输出,哪些数据在str_replace 之后包含$gross

      【讨论】:

        【解决方案6】:

        感谢大家的帮助。我选择了 Pejka 的解决方案

        $gross = floatval(preg_replace('/[^0-9,.]/', '', $_POST['unit_Price']));
        

        非常感谢您的所有帮助。一千谢谢:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-23
          相关资源
          最近更新 更多