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


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

например:

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

будет превращен в:

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

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

Спасибо =D

13 58

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 вызвало проблемы. Надеюсь, это поможет?

preg_replace будет делать трюк:

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