PHP показывает только значимые (отличные от нуля) десятичные знаки

В 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. Я могу написать функцию, которая легко справится с этим, поэтому держите ответы так.

Ответ 1

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

$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

Ответ 2

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

$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"

Ответ 3

Не должно быть?:

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

Синтаксис PHP preg_replace

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

Ответ 4

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

echo floatval(9.200);

печатает

9.2

но

echo floatval(9.123);

печатает

9.123

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

Ответ 5

Конечный ноль значителен:

  • Значение 9.0 означает, что реальное значение больше 8.9 и меньше 9.1
  • Значение 9.00000 подразумевает, что реальное значение больше 8.99999 и меньше, чем 9.00001

Поэтому ваше требование довольно необычно. Это причина, по которой функция не существует, чтобы делать то, что вы хотите.

Ответ 6

<?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

Ответ 7

Из коробки это невозможно, потому что у вас есть два разных способа обработки фрагмента ваших поплавков. Сначала вам нужно определить, сколько ненулевых чисел есть в вашем фрагменте, а затем действовать соответственно с помощью 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/>";

}

Ответ 8

Как насчет

preg_replace(/\\.$/,'.0',rtrim($value,'0'))

Ответ 9

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

$value = is_numeric($value) ? strval($value + 0) : $value;

Ответ 10

Мое решение состоит в том, чтобы позволить php обрабатывать его как число (это * 1), а затем рассматривать его как строку (в моем примере я использовал проценты, хранящиеся как десятичные числа с двумя десятичными знаками):

printf('%s%% off', $value*1);

Выводится:

0.00  => 0% off
0.01  => 0.01% off
20.00 => 20% off
20.50 => 20.5% off

Ответ 11

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

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