[英]PHP show only significant (non-zero) decimals
在PHP中(使用內置函數)我想轉換/格式化一個帶小數的數字,這樣只顯示非零小數。 然而,我的另一個要求是,如果它是一個沒有小數值的數字,我仍然希望顯示為零。 例子:
9.000 -> 9.0
9.100 -> 9.1
9.120 -> 9.12
9.123 -> 9.123
rtrim($value, "0")
幾乎可以工作。 rtrim的問題是它留下9.000
為9.
。 sprintf()
似乎是一個候選者,但我不能讓它有一個可變的小數位數。 number_format()
用於不同的目的,而這些都是我能想到的......
再次,我想指出我不是在尋找你自己的解決方案,我正在尋找一種使用內部PHP功能來實現這一目標的方法。 我可以編寫一個能夠自己輕松完成此功能的函數,所以請保持這樣的答案。
我不認為這是一種方法。 正則表達式可能是您最好的解決方案:
$value = preg_replace('/(\.[0-9]+?)0*$/', '$1', $value);
演示:
php> $a = array('0.000', '0.0001', '0.0101', '9.000', '9.100', '9.120', '9.123');
php> foreach($a as $b) { echo $b . ' => ' . preg_replace('/(\.[0-9]+?)0*$/', '$1', $b)."\n"; }
0.000 => 0.0
0.0001 => 0.0001
0.0101 => 0.0101
9.000 => 9.0
9.100 => 9.1
9.120 => 9.12
9.123 => 9.123
嘗試這樣的事情
$number = 2.00;
echo floor_dec($number,$deg);
function floor_dec($number, $deg = null)
{
if ($deg == null)
return $number * 1000 / 1000;
else
return $number * pow(10, $deg) / pow(10, $deg);
}
將顯示“2”
不應該嗎?:
$value = preg_replace('~0*$~', '', $value);
PHP preg_replace語法是
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
如果你想要一個內置的解決方案並且你使用的是4.2之后的PHP版本,你可以嘗試使用floatval()
:
echo floatval(9.200);
版畫
9.2
但
echo floatval(9.123);
版畫
9.123
希望這可以幫助。
尾隨零是重要的:
因此,您的要求非常不尋常。 這就是為什么沒有功能可以做你想要的事情的原因。
<?php
$numbers = array(
"9.000",
"9.100",
"9.120",
"9.123"
);
foreach($numbers as $number) {
echo sprintf(
"%s -> %s\n",
$number,
(float) $number == (int) $number ? number_format($number, 1) : (float) $number
);
}
?>
輸出:
9.000 -> 9.0
9.100 -> 9.1
9.120 -> 9.12
9.123 -> 9.123
開箱即用是不可能的,因為你有兩種不同的方法來處理浮動片段。 您首先必須確定片段中有多少非零數字,然后使用sprintf進行相應操作。
<?php
$numbers = array(
'9.000',
'9.100',
'9.120',
'9.123',
);
foreach ($numbers as $number) {
$decimals = strlen(str_replace('0','', array_pop(explode('.', $number))));
$decimals = $decimals ?: 1;
echo $number . " => " . sprintf("%.{$decimals}f", $number);
echo "<br/>";
}
怎么樣
preg_replace(/\\.$/,'.0',rtrim($value,'0'))
假設數字被編碼為或轉換為字符串,這是一個通用的方法:
$value = is_numeric($value) ? strval($value + 0) : $value;
我的解決方案是讓php處理它作為一個數字(是* 1)然后將其視為一個字符串(我的例子我使用的百分比存儲為小數點后2位):
printf('%s%% off', $value*1);
這輸出:
0.00 => 0% off
0.01 => 0.01% off
20.00 => 20% off
20.50 => 20.5% off
rtrim($ value,“0”)幾乎可以工作。 rtrim的問題在於它將9.000留作9。
所以只是rtrim($ value,“0”)而且你已經完成了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.