Как убрать конечные нули в PHP - PullRequest
63 голосов
/ 01 марта 2011

Привет, может кто-нибудь дать мне объяснение (и, может быть, пример), как бы я мог убрать конечные нули из числа с помощью PHP.

Например:

"Lat":"37.422005000000000000000000000000","Lon":"-122.84095000000000000000000000000"

Будет преобразовано в:

"Lat":"37.422005","Lon":"-122.84095"

Я пытаюсь убрать нули, чтобы сделать их более читабельными. Я попытался использовать str_replace(), но это также заменило нули внутри числа (дох).

Спасибо = D

Ответы [ 14 ]

113 голосов
/ 01 марта 2011

Забудьте все rtrims и регулярные выражения, координаты являются числами с плавающей точкой и должны рассматриваться как числа с плавающей точкой, просто добавьте переменную с помощью (float), чтобы привести ее из строки в число с плавающей точкой:

$string = "37.422005000000000000000000000000";
echo (float)$string;

Выход:

37.422005

Фактический результат, который у вас есть, - это числа с плавающей точкой, но он передается вам в виде строк благодаря протоколу HTTP. Хорошо бы превратить их в свою естественную форму для выполнения вычислений и т. Д.

Контрольный пример: http://codepad.org/TVb2Xyy3

Примечание : Что касается комментария о точности с плавающей запятой в PHP, см. Это: https://stackoverflow.com/a/3726761/353790

27 голосов
/ 01 марта 2011

Попробуйте с rtrim :

$number = rtrim($number, "0");

Если у вас есть десятичное число, оканчивающееся на 0 (например, 123.000), вы можете также захотите удалить десятичный разделитель , который может различаться в зависимости от используемого локали . Чтобы надежно удалить его, вы можете сделать следующее:

$number = rtrim($number, "0");
$locale_info = localeconv();
$number = rtrim($number, $locale_info['decimal_point']);

Это, конечно, не пуленепробиваемое решение и, возможно, не самое лучшее. Если у вас есть число, например 12300.00, оно не удалит завершающие 0 из целочисленной части, но вы можете адаптировать его к вашей конкретной потребности.

22 голосов
/ 28 июня 2011

Вы столкнетесь с большим количеством неприятностей, если попробуете обрезать или другие манипуляции со струнами.Попробуйте следующим образом.

$string = "37.422005000000000000000000000000";

echo $string + 0;

Выходы:

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

Вы также можете использовать floatval(val);.

 <?php
 echo floatval( "37.422005000000000000000000000000" );
 ?>

, результаты

37.422005

5 голосов
/ 05 ноября 2013

Большинство из этих решений обрезают значащие цифры в числах, например, «100» (без конечного десятичного числа). Вот простое решение, которое не имеет этой проблемы:

function TrimTrailingZeroes($nbr) {
    if(strpos($nbr,'.')!==false) $nbr = rtrim($nbr,'0');
    return rtrim($nbr,'.') ?: '0';
}

Я думаю, что это охватывает все различные сценарии.

>>> TrimTrailingZeroes('0')
=> "0"
>>> TrimTrailingZeroes('01')
=> "01"
>>> TrimTrailingZeroes('01.0')
=> "01"
>>> TrimTrailingZeroes('01.01')
=> "01.01"
>>> TrimTrailingZeroes('01.010')
=> "01.01"
>>> TrimTrailingZeroes('.0')
=> "0"
>>> TrimTrailingZeroes('.1')
=> ".1"
>>> TrimTrailingZeroes('.10')
=> ".1"
>>> TrimTrailingZeroes('3141592653589793.238462643383279502880000000000000000000000000000')
=> "3141592653589793.23846264338327950288"
4 голосов
/ 18 октября 2012

В моем случае я сделал следующее, расширив здесь другие ответы:

rtrim((strpos($number,".") !== false ? rtrim($number, "0") : $number),".");

Поскольку мне также пришлось удалить десятичную дробь, если показывалось целое число

Как пример, это покажет следующие цифры

2.00, 1.00, 28.50, 16.25 

Как

2, 1, 28.5, 16.25

Вместо

2., 1., 28.5, 16.25

Что, по-моему, не показывает их правильно.

Последнее редактирование также останавливает повторное создание чисел, таких как «100», до 1, обрезая только самые правые 0, если встречается десятичное число.

4 голосов
/ 22 июня 2012

Если вы хотите убрать лишние нули от конца, но только до определенного десятичного знака, это полезное выражение, чтобы сделать именно это (например, 0.30000 покажет 0.30, а 0.0003000 покажет 0.0003).

preg_replace("/(?<=\\.[0-9]{2})[0]+\$/","",$number);

Конечно, {2} контролирует предел десятичного разряда.

3 голосов
/ 19 августа 2012

Обрезает конечные нули, но только после десятичного знака - мы бы не хотели конвертировать 100 -> 1, например. Период также будет удален, если за ним будут следовать только нули.

function trim_zeros($str) {
    if(!is_string($str)) return $str;
    return preg_replace(array('`\.0+$`','`(\.\d+?)0+$`'),array('','$1'),$str);
}
1 голос
/ 04 декабря 2012

Мне нужно дополнительное решение для преобразования экспоненциальных значений и простых чисел, таких как 10000, в последнюю ненулевую значащую цифру

/* Convert any value to the least significant value */
function toDecimal($val) {

  // Convert any exponential sign to proper decimals
  $val = sprintf("%lf", $val);

  if (strpos($val, '.') !== false) {
      $val = rtrim(rtrim($val, '0'), '.');
  }

  return $val;
}

// Test cases
echo toDecimal(1000.000) . "\n";
echo toDecimal(1E-5) . "\n";
echo toDecimal(1E+5) . "\n";
echo toDecimal(1234.56) . "\n";
echo toDecimal(1234.5700) . "\n";
echo toDecimal(1234000) . "\n";
echo toDecimal(-1e10) . "\n";

// Results
1000
0.00001
100000
1234.56
1234.57
1234000
-10000000000
1 голос
/ 01 марта 2011

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

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