【问题标题】:number_format() php remove trailing zerosnumber_format() php 删除尾随零
【发布时间】:2018-09-28 03:43:33
【问题描述】:

如果数字不是浮点数/小数,number_format() 是否可以省略小数位?

例如,我想要以下输入/输出组合:

50.8 => 50.8
50.23 => 50.23
50.0 => 50
50.00 => 50
50 => 50

有没有办法只用标准的number_format() 来做到这一点?

【问题讨论】:

    标签: php floating-point numbers decimal number-formatting


    【解决方案1】:

    您可以将0 添加到格式化字符串。它将删除尾随零。

    echo number_format(3.0, 1, ".", "") + 0; // 3
    

    更好的解决方案: 上述解决方案不适用于特定的语言环境。因此,在这种情况下,您只需将数字类型转换为 float 数据类型。注意:类型转换为float 后可能会丢失精度,数字越大,截断数字的机会越大。

    echo (float) 3.0; // 3
    

    终极解决方案:唯一安全的方法是使用正则表达式:

    echo preg_replace("/\.?0+$/", "", 3.0); // 3
    echo preg_replace("/\d+\.?\d*(\.?0+)/", "", 3.0); // 3
    

    Snippet 1 DEMO

    Snippet 2 DEMO

    Snippet 3 DEMO

    【讨论】:

    • 我不推荐这个解决方案。例如,对于 50,它返回 5。如果可能出现不带小数点的数字,您需要这样做:\str_contains($number, '.') ? \rtrim(\rtrim($number, '0'), '.') : $number;
    • 我也不推荐! number_format() 返回一个字符串。在这种情况下它可能会起作用,但如果数量超过 1000,则会导致问题。假设您有一个数字 1234.56,number_format() 将返回“1,234.56”,如果您尝试将其转换为浮点数,结果将是 1.0.. 所以不好。
    【解决方案2】:

    如果你想在这里使用空格是更好的解决方案

    function real_num ($num, $float)
    {
        if (!is_numeric($num) OR is_nan($num)  ) return 0;
    
        $r = number_format($num, $float, '.', ' ');
    
        if (false !== strpos($r, '.'))
            $r = rtrim(rtrim($r, '0'), '.');
    
        return $r;
    } 
    

    【讨论】:

      【解决方案3】:

      用途:

      $a = 50.00;
      
      $a = round($a, 2);
      

      即使数字后面有 2 个零,如果将其四舍五入,它也不会显示小数位,除非它们具有某种值。

      所以50.00 使用 2 位四舍五入将是 50,但 50.23 将是 50.23

      除非您指定向上或向下舍入的点,否则它不会更改您的十进制值。所以只需使用默认的round()

      【讨论】:

        猜你喜欢
        • 2011-05-30
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 2012-07-01
        • 2012-07-02
        • 2020-09-11
        • 1970-01-01
        相关资源
        最近更新 更多