Привет, может кто-нибудь дать мне объяснение (и, возможно, пример) относительно того, как я могу поменять десчь нулей из числа с помощью 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);