printf, sprintf вывести как минимум два знака после запятой - PullRequest
14 голосов
/ 03 июня 2010

Я пытаюсь выяснить, как использовать sprintf для печати как минимум двух десятичных знаков без начальных нулей. Например

ввод:

23
23.0
23.5
23.55
23.555
23.0000

выход:

23.00
23.00
23.50
23.55
23.555
23.00

любая помощь в форматировании приветствуется

Ответы [ 5 ]

14 голосов
/ 03 июня 2010

Нет такого встроенного спецификатора формата. Вы можете проверить, имеет ли напечатанное число два или меньше десятичных знака (округлить до двух десятичных знаков и сравнить), и если это так, использовать% .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
1 голос
/ 13 марта 2014

в PHP вы можете использовать

<?php
$number = 0.56;
echo sprintf("%0.2f",$number);
0 голосов
/ 30 марта 2016

В 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 голосов
/ 22 февраля 2016

В PHP вы также можете использовать функцию number_format для этой цели, которая также позволяет изменять разделители.

0 голосов
/ 13 февраля 2012

Разве "23.555" .toFixed (2) не делает то, что я думаю, делает? (Javascript)

...