如何在PHP中删除尾随零

时间:2011-03-01 00:13:09

标签: php string

你好,有人可以给我一个解释(也许是一个例子),我将如何使用PHP从数字中删除尾随的零。

例如:

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

将转入:

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

我试图剥离零以使其更具可读性。我尝试使用str_replace(),但这也取代了数字中的零(doh)。

谢谢= D

15 个答案:

答案 0 :(得分:112)

忘记所有的rtrims,正则表达式,坐标是浮点数,应该被视为浮点数,只需在(float)前加上变量,将它从字符串转换为浮点数:

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

输出:

37.422005

您拥有的实际结果是浮点数,但由于HTTP协议而作为字符串传递给您,最好将它们重新转换为自然形式以进行计算等。

测试用例:http://codepad.org/TVb2Xyy3

注意:关于PHP中浮点精度的注释,请参阅:https://stackoverflow.com/a/3726761/353790

答案 1 :(得分:26)

尝试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,但您可以根据您的特定需要进行调整。

答案 2 :(得分:20)

如果你尝试修剪或其他字符串操作,你会遇到很多麻烦。试试这种方式。

$string = "37.422005000000000000000000000000";

echo $string + 0;

输出:

37.422005

答案 3 :(得分:7)

您也可以使用floatval(val);

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

结果

  

37.422005

答案 4 :(得分:5)

这些解决方案中的大多数都会修剪数字中的有效数字,例如“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"

答案 5 :(得分:4)

如果你想将多余的零点从末尾剥离而只是到某个小数位,这是一个很有用的表达式(例如0.30000表示0.30和0.0003000表示0.0003)。

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

当然{2}控制小数点限制。

答案 6 :(得分:4)

就我而言,我做了以下工作,在此处扩展了其他答案:

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”停止为1,只有在遇到小数时才修剪最右边的0。

答案 7 :(得分:3)

修剪尾随零,但仅在小数位后 - 我们不想转换100 - &gt;例如,1。如果仅跟随零,它也将剥离期间。

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

答案 8 :(得分:1)

你应该使用比replace更能操纵数字的round function

答案 9 :(得分:1)

对我来说,我需要一个进一步的解决方案,将指数值和简单数字(如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

答案 10 :(得分:0)

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

rtrim( "37.422005000000000000000000000000" , "0" )

确保会有一个小数点。

答案 11 :(得分: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。

由于我正在进行比较,因此使用浮动技术会导致问题。希望这有帮助吗?

答案 12 :(得分:0)

如果您想要一个接受最小和最大小数位数的解决方案,则该方法应该起作用:

/**
 * 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"

这是使用美国语言环境的硬编码,但应易于针对其他语言环境进行调整。

答案 13 :(得分: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

答案 14 :(得分:-2)

preg_replace可以解决问题:

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