【问题标题】:PHP - number_format different number of decimal places depending of numberPHP - number_format 不同的小数位数取决于数字
【发布时间】:2015-12-26 15:00:33
【问题描述】:

我无法以这种方式格式化数字:

Original number: 8.400
Needed number: 8.40
I can use: number_format(floatval($number), 2)

Original number: 1.500
Needed number: 1.50
I can use again: number_format(floatval($number), 2)

Original number: 3.546
Needed number: 3.546
I can use again: Here i dont know what should i use. I need that 3rd decimal

Original number: 10
Needed number: 10.00
I can use again: number_format(floatval($number), 2)

因此,如果数字包含第 3 位小数,并且第 3 位是 0,那么我需要修剪它(例如可以使用 floatval),但如果第 3 位小数不为零,那么我应该保持该数字不变。

【问题讨论】:

  • 如果您的号码是 8.4501 或 8.450001 怎么办?您的“需要的号码”是多少?
  • 可以是 8.4501 或者 8.450001,但是如果修整到 8.45 也可以。

标签: php floating-point number-formatting


【解决方案1】:

根据您的规范(即使用8.450001 => 8.45),以下代码应该适合您:

// Returns the nth digit of a float
function get_digit($number, $n) { 
    return ($number * pow(10, $n)) % 10;
}

$number = floatval($number);
$number_third_digit = get_digit($number, 3);

if($number_third_digit == 0) {
  echo number_format($number, 2);
}
else {
  echo number_format($number, 3);
}

代码可以测试here

结果

8.500 => 8.50
8.546 => 8.546
8.450001 => 8.45
10 => 10.00

【讨论】:

    【解决方案2】:

    看看这个:

    $number = 8.40;    
    $newNumber = ($number == $newnumber=sprintf('%03.2f', $number)) ? $newnumber:$number;
    

    如果sprintf构建的“格式化版本”的float值与原值不同,则保留原值。否则,请使用格式化版本。

    【讨论】:

      【解决方案3】:

      试试这个代码:

      $num = 8.40;
      if (strpos($num,'.')>-1) {
          list($int,$dec)=explode('.', $num);
      } else {
          $dec = '';
      }
      if ((strlen($dec)>2 AND $dec[2]==0) OR strlen($dec)<=2) {
          echo number_format(floatval($num),2);
      } else {
          echo floatval($num);
      }
      

      【讨论】:

      • 不要挑剔但是......如果$num没有小数部分,比如“8”
      • Amarnassan:它会触发错误(被@隐藏)并返回 0,因此请按照要求使用 2 位小数格式化。但是来吧...与其禁用 $dec[2] 的错误报告,不如直接检查 strlen($dec)?
      • 随便,但那应该包含在代码中,对吧?
      • 如果他将list 更改为@list,从技术上讲,他的代码永远不会产生任何错误。 @ 是一个错误控制运算符,它禁用错误。但 IMO 检查错误比禁用错误要干净得多。
      • 我同意错误处理并更新了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多