Intereting Posts
отладка веб-приложения Yii с использованием Zend Debugger в Eclipse Используйте пользовательские разделители в текущем шаблоне Twig отправка электронной почты с помощью функции php mail распространяется на спам Можно ли запустить функцию в переменной шаблона Silverstripe для форматирования вывода? preg_replace, вызывающий удаление знаков доллара Доступ к внешней переменной с использованием анонимной функции в качестве параметров Предупреждение: session_start () не удалось: нет такого файла или каталога как импортировать файл .sql в базу данных mysql, используя php Загрузка файлов с помощью SFTP PHP Curl post с неанглийскими символами Невозможно расшифровать токен CSRF / XSRF в Laravel, отправленный через Angular PHP – редактирование / удаление определенной строки в файле Как создать sub.domain для пользователя opon зарегистрироваться Конкатенация строк PHP Laravel: Слишком мало аргументов для функции Illuminate \ Support \ Manager :: createDriver ()

Как удалить конечные нули в PHP

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

Например:

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

Был бы включен:

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

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

Спасибо = D

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

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

вывод:

 37.422005 

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

Тестовый пример: http://codepad.org/TVb2Xyy3

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

Попробуйте с 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 из целой части, но вы можете адаптировать его к вашим конкретным потребностям.

У вас будет много проблем, если вы попробуете подрезку или другие манипуляции с строками. Попробуйте это.

 $string = "37.422005000000000000000000000000"; echo $string + 0; 

Выходы:

 37.422005 

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

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

приводит к

37.422005

Я знаю, что этот вопрос задавали в 2012 году, но я просто нашел это простое решение …

 $result = $num + 0; 

Поэтому для этого вопроса было бы:

 $lat = 37.422005000000000000000000000000 + 0; //37.422005 $lon = -122.84095000000000000000000000000 + 0; //-122.84095 

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

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

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

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

 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», от rtrim'ed до 1, только обрезая крайние правые 0, если встречается десятичное число.

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

 function trim_zeros($str) { if(!is_string($str)) return $str; return preg_replace(array('`\.0+$`','`(\.\d+?)0+$`'),array('','$1'),$str); } 

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

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

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

хм, интересно. Я использовал это:

 // remove leading zeros $output = ltrim ($output, "0"); // remove trailing 0s. $temp=explode(".",$output); $temp[1]=rtrim($temp[1],"0"); $output = $temp[0]; if (!empty($temp[1])) $output.='.'.$temp[1]; return $output; 

Это удаляет конечные 0s из числа после первой десятичной точки. В противном случае число 100 равно 1.

Поскольку я делал сравнение, использование метода float вызывало проблемы. Надеюсь это поможет?

Как и ответ Okonomiyaki3000 вместо добавления, вы также можете умножить на 1, например

 $string = "37.422005000000000000000000000000"; echo $string*1;die; // outputs - 37.422005 

Вы можете использовать rtrim () ( http://www.php.net/manual/en/function.rtrim.php ):

 rtrim( "37.422005000000000000000000000000" , "0" ) 

Просто убедитесь, что будет десятичная точка.

Для меня мне нужно другое решение для преобразования экспоненциальных значений и простых чисел, таких как 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 

preg_replace сделает трюк:

 $lat=preg_replace('/0+$/','',$lat);