Показать десятичное число в PHP - PullRequest
0 голосов
/ 26 ноября 2011

Я храню десятичные числа в базе данных, используя 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

Ответы [ 5 ]

2 голосов
/ 26 ноября 2011

Это будет работать для вас:

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

Пример

1 голос
/ 26 ноября 2011

Ну вот один из способов (я еще не проверял его, поэтому возможны незначительные ошибки):

$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;
0 голосов
/ 27 июня 2012

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

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;
}
0 голосов
/ 26 ноября 2011

Я не использовал его сам, но есть класс NumberFormatter: http://php.net/manual/class.numberformatter.php как часть Функции интернационализации для этого материала.Я думаю, что это немного сложнее.

0 голосов
/ 26 ноября 2011

Я бы использовал функцию number_format в php для фактического форматирования после того, как вы определили количество десятичных разрядов для числа.

Источник: 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
...