PHP показывает только значащие (ненулевые) десятичные дроби - PullRequest
14 голосов
/ 25 марта 2011

В PHP (с использованием встроенных функций) я хотел бы преобразовать / отформатировать число с десятичной дробью, чтобы отображались только ненулевые десятичные дроби. Тем не менее, еще одно мое требование состоит в том, что если это число без десятичного значения, я все равно хотел бы показать этот ноль. Примеры:

9.000 -> 9.0
9.100 -> 9.1
9.120 -> 9.12
9.123 -> 9.123

rtrim($value, "0") почти работает. Проблема с rtrim в том, что он оставляет 9.000 как 9.. sprintf() казалось кандидатом, но я не мог получить переменное количество знаков после запятой. number_format() служит другой цели, и это все, что я мог придумать ...

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

Ответы [ 11 ]

7 голосов
/ 25 марта 2011

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

$value = preg_replace('/(\.[0-9]+?)0*$/', '$1', $value);

Демо-версия:

php> $a = array('0.000', '0.0001', '0.0101', '9.000', '9.100', '9.120', '9.123');
php> foreach($a as $b) { echo $b . ' => ' . preg_replace('/(\.[0-9]+?)0*$/', '$1', $b)."\n"; }
0.000 => 0.0
0.0001 => 0.0001
0.0101 => 0.0101
9.000 => 9.0
9.100 => 9.1
9.120 => 9.12
9.123 => 9.123
6 голосов
/ 31 октября 2012

попробуйте что-то вроде этого

$number = 2.00;
echo floor_dec($number,$deg);

    function floor_dec($number, $deg = null)
    {
        if ($deg == null)
            return $number * 1000 / 1000;
        else
            return $number * pow(10, $deg) / pow(10, $deg);
    }

будет отображать "2"

5 голосов
/ 25 марта 2011

Разве это не должно быть?:

$value = preg_replace('~0*$~', '', $value);

Синтаксис PHP preg_replace:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
3 голосов
/ 07 марта 2014

Если вам нужно встроенное решение и вы используете версию PHP более позднюю, чем 4.2, вы можете попробовать floatval():

echo floatval(9.200);

отпечатков

9.2

но

echo floatval(9.123);

отпечатки

9.123

Надеюсь, это поможет.

2 голосов
/ 25 марта 2011
<?php
    $numbers = array(
        "9.000",
        "9.100",
        "9.120",
        "9.123"
    );
    foreach($numbers as $number) {
        echo sprintf(
            "%s -> %s\n",
            $number,
            (float) $number == (int) $number ? number_format($number, 1) : (float) $number
        );
    }
?>

Выход:

9.000 -> 9.0
9.100 -> 9.1
9.120 -> 9.12
9.123 -> 9.123
2 голосов
/ 25 марта 2011

Конечный ноль является значимым:

  • Значение 9,0 означает, что реальное значение больше 8,9 и меньше 9,1
  • Значениеиз 9.00000 подразумевает, что реальная стоимость составляет более 8,99999 и меньше 9,00001

Таким образом, ваше требование довольно необычно.Вот почему не существует функции, которая делает то, что вы хотите.

1 голос
/ 25 марта 2011

Из коробки это невозможно, потому что у вас есть два разных способа обработки фрагментов ваших поплавков. Сначала вам нужно определить, сколько ненулевых чисел в вашем фрагменте, а затем действовать соответствующим образом с помощью sprintf.

<?php

$numbers = array(
    '9.000',
    '9.100',
    '9.120',
    '9.123',
);

foreach ($numbers as $number) {

    $decimals = strlen(str_replace('0','', array_pop(explode('.', $number))));
    $decimals = $decimals ?: 1;
    echo $number . " => " . sprintf("%.{$decimals}f", $number);

    echo "<br/>";

}
0 голосов
/ 25 октября 2017

Предполагая, что число закодировано как или приведено к строке, вот подход общего назначения:

$value = is_numeric($value) ? strval($value + 0) : $value;
0 голосов
/ 12 июля 2013

Как насчет

preg_replace(/\\.$/,'.0',rtrim($value,'0'))
0 голосов
/ 13 марта 2012

rtrim ($ value, "0") почти работает.Проблема с rtrim в том, что он оставляет 9.000 как 9.

Так что просто rtrim ($ value, "0.") и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...