В 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. Я могу написать функцию, которая легко справится с этим, так что держите ответы так.
Я не думаю, что это способ сделать это. Регулярное выражение, вероятно, является лучшим решением:
$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
попробуй что-нибудь вроде этого
$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"
Не должно быть ?:
$value = preg_replace('~0*$~', '', $value);
Синтаксис PHP preg_replace
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
Если вы хотите встроенное решение, и вы используете версию PHP позже 4.2, вы можете попробовать floatval()
:
echo floatval(9.200);
печать
9.2
но
echo floatval(9.123);
печать
9.123
Надеюсь это поможет.
Конечный ноль значителен:
Поэтому ваше требование довольно необычно. Вот почему не существует никакой функции, чтобы делать то, что вы хотите.
<?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
Из коробки это невозможно, потому что у вас есть два разных способа обработки фрагмента ваших поплавков. Сначала вам нужно определить, сколько ненулевых чисел есть в вашем фрагменте, а затем действовать соответственно с помощью 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/>"; }
Как насчет
preg_replace(/\\.$/,'.0',rtrim($value,'0'))
Предполагая, что число закодировано или передано в строку, это общий подход:
$value = is_numeric($value) ? strval($value + 0) : $value;
Мое решение состоит в том, чтобы позволить 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
rtrim ($ value, "0") почти работает. Проблема с rtrim заключается в том, что она оставляет 9000 как 9.
Так что просто rtrim ($ value, "0."), и все готово.