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

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

 $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 

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

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

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

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

 <?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."), и все готово.