【问题标题】:Show decimal point number in PHP在 PHP 中显示小数点
【发布时间】:2012-01-06 16:23:20
【问题描述】:

我使用 DECIMAL(10,5) 在数据库中保存小数

我想根据一些规则来格式化这些数字:

  • 零小数应显示为 0
  • 显示一个长小数(没有尾随零)及其所有数字
  • 如果可能,我希望只显示最多 2 位小数(当有尾随零时)

这里有一些例子:

  • 左侧对应数字在数据库中的存储方式。
  • 正确的数字是我希望在我的应用程序中显示数字的方式。

0.00000 => 0
0.51231 => 0.51231
0.12000 => 0.12
0.40000 => 0.40
0.67800 => 0.678
12.10000 => 12.10

【问题讨论】:

  • 您想要的输出似乎没有遵循确定的模式。大多数没有尾随零,而两个有一个。您真的要将 0.40000 显示为 0.40 还是更愿意显示为 0.4?
  • 这对我来说很有意义。带有小数部分的数字应在小数点后至少显示两位。如果有更多的数字,它们应该被保留。但不允许任何少于两个的显示。
  • 是的,这些是价格,显示时至少需要两位小数。
  • 不,根据问题。但我很好奇是否所有整数都不应该有“.00”,或者它是否只适用于零。
  • 当您说 0.00 时,表示您确信该数字是 0 到百分之一(介于 -0.005 和 0.005 之间)。当您说 0 时,它表示没有具体的信心。那么……这是干什么用的?

标签: php database numbers format decimal


【解决方案1】:

在确定数字的小数位数后,我将利用 php 中的 number_format 函数来实际进行格式化。

来源: http://php.net/manual/en/function.number-format.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 separator
$english_format_number = number_format($number, 2, '.', '');
// 1234.57

【讨论】:

  • 当然,这会将较长的数字四舍五入到小数点后两位,这不是提问者想要的。
  • number_format的第二个参数是你想要的小数位数,所以有点逻辑就可以了
【解决方案2】:

这是一种方法(我还没有测试过,所以可能会有小错误):

$pattern = '/([0-9]+)\\.{0,1}([0-9]*?)0*$/';
$subject = 12.10000;
$matches = array();
$result = preg_match ($pattern, $subject, $matches);
$number = $matches[1];
if ($matches[2] != 0) {
    $number .= '.'.$matches[2];
    if ($matches[2] < 10) {
        $number .= '0';
    }
}
echo $number;

还有另一种方式(可能快一点):

$x = 1.000;
$result = (int)$x;

$trimmed = rtrim($x, 0);
if ($trimmed[strlen($trimmed) - 1] != '.') {
    if ($trimmed[strlen($trimmed) - 2] == '.') {
        $result = $trimmed.'0';
    } else {
        $result = $trimmed;
    }
}
echo $result;

【讨论】:

  • 好的,我已经测试过了。它有效,但可能有更好的解决方案。
【解决方案3】:

我自己没有使用它,但是有 NumberFormatter 类:http://php.net/manual/class.numberformatter.php 作为 Internationalization Functions 的一部分。我认为使用它有点复杂。

【讨论】:

    【解决方案4】:

    这对你有用:

    function format($x){
        if(!(int)substr_replace($x, '', $dpos = strpos($x, '.'), 1))
            return 0;
        else
            return str_pad((rtrim($x, '0')), $dpos + 3, '0'); 
    }
    

    Example

    【讨论】:

    • 它需要一个至少有 2 位小数的字符串格式的数字。
    • @Godwin 你一定一直在看一个介于编辑之间的版本吗?我不明白。
    • 我认为你的目标更像是:function format($x){ if((int)$x == $x) { return $x; } else { return str_pad((rtrim($x, '0')), strpos($x, '.') + 3, '0'); } }
    • @Godwin 不,我在评论中提到它需要一个字符串 IE format('12.0000'); 它输出 12.00 在这种情况下,我认为这是 OP 想要的。如果他想要 12 个,尽管他必须将其更改为像您的一样。
    • 没关系,但你的输出“​​120”,输入“12.000”,输入“1.000”时输出“0”。尝试将这些添加到您的测试中。
    【解决方案5】:

    我知道这是一个老问题,但是我为自己的项目编写的以下快速函数可能会帮助寻找这个问题的人。

    function number_format_least_dp($number, $decimal_point = '.', $thousand_seperator = ','){
        if (floatval($number) == (int)$number){
            $number = number_format($number, 0, $decimal_point, $thousand_seperator);
        } else {
            $number = rtrim($number, '.0');
            $number = number_format($number, strlen(substr(strrchr($number, '.'), 1)), $decimal_point, $thousand_seperator);
        }
        return $number;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多