簡體   English   中英

如何去除 PHP 中的尾隨零

[英]How to strip trailing zeros in PHP

誰能給我一個關於如何使用 PHP 從數字中去除尾隨零的解釋(也許是一個例子)。

例如:

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

將變成:

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

我正在嘗試去除零以使其更具可讀性。 我嘗試使用str_replace()但這也替換了數字內的零。

忘記所有的 rtrims 和正則表達式,坐標是浮點數,應該被視為浮點數,只需在變量前面加上(float)即可將其從字符串轉換為浮點數:

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

輸出:

37.422005

您擁有的實際結果是浮點數,但由於 HTTP 協議而作為字符串傳遞給您,最好將它們轉換回其自然形式以進行計算等。

測試用例: http : //codepad.org/TVb2Xyy3

注意:關於 PHP 中浮點精度的評論,請參見: https : //stackoverflow.com/a/372​​6761/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

就我而言,我執行了以下操作,並在此處擴展了其他答案:

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

對我來說,這沒有正確顯示它們。

最新編輯還通過僅在遇到小數時修剪最右邊的 0 來阻止諸如“100”之類的數字被 rtrim'ed 為 1。

您也可以使用floatval(val); .

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

結果是

37.422005

這些解決方案中的大多數將修剪數字中的有效數字,例如“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"

如果您想從末尾去除多余的零,但只保留到某個小數位,這是一個有用的表達式(例如 0.30000 將顯示 0.30,0.0003000 將顯示 0.0003)。

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

當然,{2} 控制小數位限制。

修剪尾隨零,但只在小數位之后——例如,我們不想轉換 100 -> 1。 如果后面只有零,它也會去掉句號。

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

您應該使用round 函數,它比replace更能操作數字。

round('37.422005000000000000000000000000', 32); 
//float(37.422005)

round('-122.84095000000000000000000000000', 32); 
//float(-122.84095)

生成的四舍五入數字將基於您的precision (默認 14)設置。

如果您想要一個接受最小和最大小數位數的解決方案,這應該有效:

/**
 * 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, int $minimumDecimals = 2, int $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"

這是硬編碼以使用美國語言環境,但應該很容易針對其他語言環境進行調整。

對我來說,我需要一個進一步的解決方案來將指數值和簡單的數字(如 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

嗯,有意思。 我用過這個:

// 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。

由於我在做比較,使用浮動技術會導致問題。 希望這可以幫助?

您可以使用 rtrim() ( http://www.php.net/manual/en/function.rtrim.php ):

rtrim( "37.422005000000000000000000000000" , "0" )

只要確保會有小數點。

刪除尾隨零 + 千位分隔符

function specialFormat($number,  $decimals = 8)
{
    return rtrim(rtrim(number_format($number, $decimals), '0'), '.');
}

input: 0.00000008 => output: 0.00000008
input: 1560.1854500 => output: 1,560.18545
input: 1560.00 => output: 1,560

preg_replace可以解決問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM