Числовой формат с плавающей точкой - PullRequest
7 голосов
/ 14 ноября 2009

Я хочу использовать функцию number_format в PHP. Например:

$number = 234.51;
echo number_format($number,2);

Это работает для чисел с плавающей точкой, но я хочу использовать его для разных чисел. Если число является десятичным и не имеет плавающих точек, оно отображается как: 145.00. Как я могу это исправить? Я имею в виду, я хочу показать столько плавающих точек, сколько нужно, не больше.

Ответы [ 8 ]

11 голосов
/ 14 ноября 2009

Исследуйте функции printf и sprintf вместо number_format.

Они дают возможность форматировать числа по вашему желанию.

printf("%d", $int) 

будет соответствовать десятичному целому числу.

printf("%4.2f", $float) 

будет подходящим для числа с плавающей запятой с двумя десятичными знаками.

number_format, похоже, предназначен для интернационализации производства валюты, но я не думаю, что вы этого хотите, потому что вы упомянули десятичные целые числа.

7 голосов
/ 14 ноября 2009

Я думаю, что я не могу получить то, что я хочу от number_format, поэтому я сделал это, и он отлично работает:

 public function floatNumber($number)
 {
      $number_array = explode('.', $number);
      $left = $number_array[0];
      $right = $number_array[1];
      return number_format($number, strlen($right));
 }

Спасибо всем за ваши ответы.

3 голосов
/ 14 ноября 2009

Я не знаю лучшего способа сделать это, но вы можете сравнить тип, как показано ниже:

$number = 234.159;
if(is_float($number)) {
 echo number_format($number, 2);
}else {
 echo $number;
}
2 голосов
/ 14 ноября 2009

Хотя это немного быстро и грязно, вы можете просто сделать ...

str_replace('.00', '', number_format($potentialFloat, 2));

Далеко от идеала, но эффективно.

1 голос
/ 14 ноября 2009
rtrim(number_format($number, 2), '0.');
1 голос
/ 14 ноября 2009

Я думаю, что ключевой проблемой является определение количества необходимых позиций. Вы бы определили 13.01 как 13, потому что первое десятичное число было 0? Поскольку printf и числовой формат требуют, чтобы вы знали, сколько десятичных знаков, я не знаю, что это сработало бы для вас.

Может быть, что-то вроде этого (много функций, но ищет первый 0, а затем возвращает усеченную строку). Да, это интенсивно, но это может быть лучшим способом для вас.

function show_number($number, $max = 8){
  if(strpos($number, '.')){
    $decimal = strpos($number, '.');
    if(strpos($number, '.0')){
      return substr($number, 0, $decimal);//returns whole if zero is first
    } else {
      if(strpos(substr($number, $decimal, $max), '0')){
        $zero = strpos(substr($number, $decimal, $max), '0');
        return substr($number, 0, $decimal+$zero);//returns number w/0 first zero
      } else {
        return substr($number, 0, $decimal+$max+1); //returns number with max places
      }
    }
  } else {
    return $number; //returns number if no decimals
  }
}
0 голосов
/ 11 июня 2015
$x = $x - floor($x)

даст вам правильное значение с плавающей запятой ...

0 голосов
/ 03 марта 2013

Я использую следующее, чтобы избавиться от конечных нулей:

// Trims a floating point number so there are no trailing zeros. For example:
// 1.00 -> 1
// 1.10 -> 1.1
function trimFloatingPoint($input) {
    $strNum = strval($input);

    while(substr($strNum, -1, 1) == '0')
        $strNum = substr($strNum, 0, strlen($strNum) -1);

    // Trailing zeros are gone. How about the trailing period?
    if(substr($strNum, -1, 1) == '.')
        $strNum = substr($strNum, 0, strlen($strNum) -1);

    return $strNum;
}
...