【问题标题】:In PHP, how to print a number with 2 decimals, but only if there are decimals already?在 PHP 中,如何打印带有 2 个小数的数字,但前提是已经有小数?
【发布时间】:2011-04-13 11:11:06
【问题描述】:

我有一个基本的 index.php 页面,其中包含一些我想在几个地方打印的变量 - 这里是变量:

<?php
  $firstprice = 1.50;
  $secondprice = 3.50;
  $thirdprice = 20;
?>

我的挑战是,在文档的后面,当我打印时,我得到的价格没有第二个“0” - 这就是发生的情况:

<?php print "$firstprice";?> // returns 1.5 - not 1.50!

SO - 我知道如何使用 JS 来做到这一点,但是在 PHP 5+ 中如何做到这一点?基本上如果已经有小数,我想打印第二个'0',所以如果变量等于'3',它保持为'3',但如果它等于'3.5',它转换为显示'3.50'用第二个“0”等。

这是一个 JS 示例 - PHP 等价物是什么?

JS:

.toFixed(2).replace(/[.,]00$/, ""))

非常感谢!!

【问题讨论】:

  • Jon 的回答(如下)效果很好 - 谢谢 Jon!

标签: php javascript decimal


【解决方案1】:

这很简单,它还可以让您调整格式以适应口味:

$var = sprintf($var == intval($var) ? "%d" : "%.2f", $var);

如果变量没有小数,它会将变量格式化为整数 (%d),如果变量有小数部分,则格式化为两个小数位 (%.2f)。

See it in action.

更新:正如 Archimedix 指出的那样,如果输入值在 (2.995, 3.005) 范围内,这将导致显示 3.00。以下是修复此问题的改进检查:

$var = sprintf(round($var, 2) == intval($var) ? "%d" : "%.2f", $var);

【讨论】:

  • 这不会考虑通过舍入获得的.00,所以我建议在最终结果中替换.00而不是检查值,或者检查分数($var - floor($var))舍入阈值,例如如果$var 为正,则反对.005,如果为负,则反对0.995
  • 案例:假设您计算加税后的价格,您可以获得分数
  • @Archimedix:很好。我以尽可能短的方式解决了这个问题,以使解决方案保持单线。
【解决方案2】:
<?php

$number = 1234.56;

// english notation (default)
$english_format_number = number_format($number);
// 1,235

// French notation
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56

$number = 1234.5678;

// english notation without thousands seperator
$english_format_number = number_format($number, 2, '.', '');
// 1234.57

?>

更多信息在这里 http://php.net/manual/en/function.number-format.php

【讨论】:

  • 不完全...如果数字是整数,或者如果前两位小数舍入为 0,这也将打印 2 个小数。之后仍然需要消除 .00,例如使用str_replace()
【解决方案3】:

你可以使用

   if (is_float($var)) 
   {
     echo number_format($var,2,'.','');
   }
   else
   {
     echo $var;
   }

【讨论】:

    【解决方案4】:

    这样的事情怎么样:

    $value = 15.2; // The value you want to print
    
    $has_decimal = $value != intval($value);
    if ($has_decimal) {
        echo number_format($value, 2);
    }
    else {
        echo $value;
    }
    


    备注:

    • 您可以使用number_format() 将值格式化为两位小数
    • 如果该值为整数,则直接显示。

    【讨论】:

    • 改用is_float是不是很方便?
    • @Shakti :它可能比我第一次发布的更容易,是的 (我后来也编辑过 ^^) ;谢谢:-)
    • @Shakti Singh 在这种情况下是的,但这取决于他从哪里获取数据。
    • @basmegakapa - 好点 - 但在这种情况下,变量是在同一页面中声明的。
    【解决方案5】:

    你可以使用number_format():

    echo number_format($firstprice, 2, ',', '.');
    

    【讨论】:

    • 谢谢!实际上,我稍微改变了这一点,以确保数字格式带有“。”而不是“,”来标记小数点 - 这是美国和欧盟标记数字系统之间的差异 - 所以结果是 echo number_format($firstprice, 2, '.', ',');但是 - 这仍然会将 20 美元变成 20.00 美元 - 我想确保没有小数的数字保持这种状态......所以这里缺少什么?
    • 哦,我明白了。因为这个 number_format 不是正确的 coice,因为它每次都附加 ,00...
    【解决方案6】:

    另一种打印方式

    $number = sprintf('%0.2f', $numbers); 
       // 520.89898989 -> 520.89
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-11
      • 2011-02-02
      • 2021-05-07
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多