Подтвердить что ты не робот

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

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

Например:

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

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

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

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

Спасибо = D

4b9b3361

Ответ 1

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

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

выход:

37.422005

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

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

Примечание. Что касается комментария о точности с плавающей запятой в PHP, см. это: fooobar.com/questions/7614/...

Ответ 2

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

Ответ 3

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

$string = "37.422005000000000000000000000000";

echo $string + 0;

Выходы:

37.422005

Ответ 4

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

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

приводит к

37.422005

Ответ 5

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

$result = $num + 0;

Итак, для этого вопроса это будет:

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

Ответ 6

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

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

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

Ответ 7

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

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, если встречается десятичное число.

Ответ 8

Большинство из этих решений будут обрезать значащие цифры в числах, таких как "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"

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

rtrim( "37.422005000000000000000000000000" , "0" )

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

Ответ 14

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

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

Ответ 15

Если вы хотите решение, которое принимает минимальное и максимальное количество знаков после запятой, это должно работать:

/**
 * Displays up to 4 decimal places, with a minimum of 2 decimal places, trimming unnecessary zeroes
 *
 * @param mixed $number
 * @param int $minimumDecimals
 * @param int $maximumDecimals
 * @return string
 */
function rate_format($number, $minimumDecimals = 2, $maximumDecimals = 4): string
{
    $formatted = number_format($number, $maximumDecimals, '.', ',');
    $minimumLength = strpos($formatted, '.') + $minimumDecimals + 1;
    $extra = rtrim(substr($formatted, $minimumLength), "0");
    return substr($formatted, 0, $minimumLength) . $extra;
}


// rate_format("1.2500") returns "1.25"
// rate_format("1.2525") returns "1.2525"
// rate_format("1.25256") returns "1.2526"
// rate_format("1") returns "1.00"

Это жестко запрограммировано для использования в США, но должно быть легко адаптировано для других языков.

Ответ 16

preg_replace выполнит трюк:

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