你好,有人可以给我一个解释(也许是一个例子),我将如何使用PHP从数字中删除尾随的零。
例如:
"Lat":"37.422005000000000000000000000000","Lon":"-122.84095000000000000000000000000"
将转入:
"Lat":"37.422005","Lon":"-122.84095"
我试图剥离零以使其更具可读性。我尝试使用str_replace()
,但这也取代了数字中的零(doh)。
谢谢= D
答案 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);