Как удалить конечные нули в PHP
привет может ли кто - нибудь дать мне объяснение (и, возможно, пример) о том, как бы я пошел на удаление конечных нулей из числа с помощью PHP.
например:
"Lat":"37.422005000000000000000000000000","Lon":"-122.84095000000000000000000000000"
будет превращен в:
"Lat":"37.422005","Lon":"-122.84095"
Я пытаюсь удалить нули, чтобы сделать его более читаемым. Я пробовал использовать str_replace()
но это заменило нули внутри числа тоже (doh).
Спасибо =D
13 ответов:
Забудьте все rtrims и регулярные выражения, координаты являются плавающими и должны рассматриваться как плавающие, просто добавьте переменную с
(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
Если вы хотите удалить лишние нули от конца, но только до определенного десятичного знака, это полезное выражение, чтобы сделать именно это (например, 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" не так работает объед в 1, только обрезки самые правые 0, если встречается десятичное число.
большинство из этих решений будет обрезать значащие цифры в числах, таких как" 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"
обрезает конечные нули, но только после десятичного знака-мы не хотели бы конвертировать 100 - > 1, например. Он также лишит период, если за ним следуют только нули.
function trim_zeros($str) { if(!is_string($str)) return $str; return preg_replace(array('`\.0+$`','`(\.\d+?)0+$`'),array('',''),$str); }
вы должны использовать круглый функция который более способен манипулировать числами, чем
replace
.
для меня мне нужно дальнейшее решение для преобразования экспоненциальных значений и простых чисел, таких как 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
вы можете использовать rtrim () (http://www.php.net/manual/en/function.rtrim.php ):
rtrim( "37.422005000000000000000000000000" , "0" )
просто убедитесь, что там будет запятой.
Хм, интересно. Я использовал это:
// 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;
это удаляет конечные 0 из числа после первой десятичной точки. В противном случае, как 100 будет 1.
Так как я делал сравнение, использование метода float вызвало проблемы. Надеюсь, это поможет?