如何格式化数字以使其具有特定的位数?

时间:2015-10-06 19:27:22

标签: php

例如,假设我想要3个数字,那么:

1 -> 1.00
10 -> 10.0
100 -> 100
1000 -> 1000 // don't lop off any numbers, as they're all significant

我以为我可以通过以下方式做到这一点:

number_format($n, max(0,$digits-strlen((string)intval($n))), null, '')

适用于上述所有情况,但99.99失败(给100.0代替100)。

所以我不太清楚如何做到这一点。计算小数位前的位数将无效,因为它可能在舍入后发生变化。

N.B。当我说“数字”时,我的意思是在小数点后的之前的总位数。另请注意,这与“有效数字”并不完全相同,因为我将“1000”计为“4位数”,即“1位有效数字”和“0位小数位”。

2 个答案:

答案 0 :(得分:1)

尝试以下

number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');

php > $n=1;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
1.00
php > $n=10;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
10.0
php > $n=100;                                                                                                                                                           
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
100
php > $n=1000;                                                                                                                                                          
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
1000
php > $n=99.99;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
100
php > $n=99.9;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
99.9

答案 1 :(得分:0)

我想出了一些东西。以下是它的要点:

function _whole_digit_count($n) {
    return strlen(abs((int)$n));
}

function _does_round_up($n, $d) {
    return _whole_digit_count(number_format($n, $d, null, '')) > _whole_digit_count($n);
}

function round_digits($size, $digits=3) {
     $wd = _whole_digit_count($size);
     $decimals = $digits - $wd;
     if($decimals > 0) {
        if(_does_round_up($size, $decimals)) {
            --$decimals;
        }
     }

     return number_format($size, $decimals, null, '')
}

基本上,我们在这里使用number_format来进行舍入并添加0,但我们首先必须计算出我们想要的小数位数。我们通过减去小数点左边的位数来做到这一点。

然而,这可能导致四舍五入,使得另一个数字被添加到整数。在这种情况下,我们必须减去额外的小数位。