问题 printf,sprintf打印至少两位小数


我试图弄清楚如何使用sprintf打印至少两个小数位并且没有前导零。例如

输入:

23
23.0
23.5
23.55
23.555
23.0000

输出:

23.00
23.00
23.50
23.55
23.555
23.00

任何格式化帮助将不胜感激


1865
2018-06-03 14:24


起源



答案:


没有这样的内置格式说明符。您可以检查要打印的数字是否有两个或更少的小数(舍入到两位小数并进行比较),如果是,请使用%.02f。如果数字有更多小数,请使用%g说明符。这是Ruby中的一个例子:

def print_two_dec(number)
  rounded = (number*100).to_i / 100.0
  if number == rounded
    printf "%.02f\n", number
  else
    printf "%g\n", number
  end
end

[ 23, 23.0, 23.5, 23.55, 23.555 ].each do |number|
  print_two_dec(number)
end

输出:

23.00
23.00
23.50
23.55
23.555

12
2018-06-03 14:30





在PHP中你可以使用

<?php
$number = 0.56;
echo sprintf("%0.2f",$number);

3
2018-03-12 21:52



不。他说 至少 2位小数。刚试过这个,它会在PHP中截断。 - mpen


答案:


没有这样的内置格式说明符。您可以检查要打印的数字是否有两个或更少的小数(舍入到两位小数并进行比较),如果是,请使用%.02f。如果数字有更多小数,请使用%g说明符。这是Ruby中的一个例子:

def print_two_dec(number)
  rounded = (number*100).to_i / 100.0
  if number == rounded
    printf "%.02f\n", number
  else
    printf "%g\n", number
  end
end

[ 23, 23.0, 23.5, 23.55, 23.555 ].each do |number|
  print_two_dec(number)
end

输出:

23.00
23.00
23.50
23.55
23.555

12
2018-06-03 14:30





在PHP中你可以使用

<?php
$number = 0.56;
echo sprintf("%0.2f",$number);

3
2018-03-12 21:52



不。他说 至少 2位小数。刚试过这个,它会在PHP中截断。 - mpen


“23.555”.toFixed(2)不符合我的想法吗? (JavaScript)的


0
2018-02-13 03:19



主题是关于格式化。没有四舍五入。除了, toFixed 因其是否向上或向下变得非常不一致而闻名。 - Kafoso
当问题是将值格式化为一定数量的小数位时,格式化和舍入之间的区别似乎是语义上的。如果你有一些关于不一致的细节 toFixed 这可能是一个有用的补充。 - SimplGy


在PHP中,您可以使用 number_format 此功能也可用于更改分隔符。


0
2018-02-22 08:49





在PHP这是我做的(灵感来自这篇文章)。也许不是最优雅但是...我创建了一个将数字打印为字符串的功能。我希望能够具有灵活性,因此我有几个参数。

PHP:

function print_num($num,$numdec,$atleast = false,$max_dec = -1)
{

  $ret_norm = false;

  if (!$atleast)
    $ret_norm = true;
  else //atleast = true
  {
    //Want at least $numdec decimals

    //Do we have two or fewer and want to return two or fewer?
    if ($num == ((int)($num*100)/100) & $numdec <= 2 )
      $ret_norm = true;
    else
    {
      //See if we have enough dec. already
      $just_dec = substr((string)$num,strpos((string)$num,".") + 1);
      if ($numdec >= strlen($just_dec))
        $ret_norm = true;
      else
      {
        //More decimals than at least value - make sure we don't go over max if set
        if ( $max_dec >= 0 && strlen($just_dec) > $max_dec )
        {
          //Confine to max_dec length
          $ret_norm = true;
          $numdec = $max_dec;                   //Set for sprintf below
          $num = number_format($num,$max_dec);  //Round the value so doesn't just chop off

        }
        else if ($max_dec >= 0)
          $ret_norm = false;
      } //else
    } //else
  } //else atlest

  if ($ret_norm)
    return sprintf("%0.".$numdec."f",$num);
  else
      return sprintf("%s",$num); //print as is

} //print_num

并调用该函数(至少有两位小数,但最多4位:

print_num($mynum,2,true,4);

如果数字是34.1,则得到34.10

如果数字是34.12345,你得到34.1235

等等


0
2018-03-30 19:40