我试图弄清楚如何使用 sprintf 打印至少两位小数且没有前导零。比如说
输入:
23
23.0
23.5
23.55
23.555
23.0000
输出:
23.00
23.00
23.50
23.55
23.555
23.00
任何格式帮助将不胜感激
没有这样的内置格式说明符。您可以检查要打印的数字是否有两位或更少的小数(四舍五入到两位小数并进行比较),如果是,则使用 %.02f。如果数字有更多小数位,请使用 %g 说明符。这是 Ruby 中的示例:
def print_two_dec(number)
rounded = (number*100).to_i / 100.0
if number == rounded
printf "%.02f\n", number
else
printf "%g\n", number
end
end
[ 23, 23.0, 23.5, 23.55, 23.555 ].each do |number|
print_two_dec(number)
end
输出:
23.00
23.00
23.50
23.55
23.555
在 PHP 中你可以使用
<?php
$number = 0.56;
echo sprintf("%0.2f",$number);
number_format
函数来实现此目的,它也允许您更改分隔符。
在 php 中,这就是我所做的(受到这篇文章的启发)。也许不是最优雅的,但是......我做了一个将数字打印为字符串的函数。我希望能够具有灵活性,因此我有几个参数。
PHP:
function print_num($num,$numdec,$atleast = false,$max_dec = -1)
{
$ret_norm = false;
if (!$atleast)
$ret_norm = true;
else //atleast = true
{
//Want at least $numdec decimals
//Do we have two or fewer and want to return two or fewer?
if ($num == ((int)($num*100)/100) & $numdec <= 2 )
$ret_norm = true;
else
{
//See if we have enough dec. already
$just_dec = substr((string)$num,strpos((string)$num,".") + 1);
if ($numdec >= strlen($just_dec))
$ret_norm = true;
else
{
//More decimals than at least value - make sure we don't go over max if set
if ( $max_dec >= 0 && strlen($just_dec) > $max_dec )
{
//Confine to max_dec length
$ret_norm = true;
$numdec = $max_dec; //Set for sprintf below
$num = number_format($num,$max_dec); //Round the value so doesn't just chop off
}
else if ($max_dec >= 0)
$ret_norm = false;
} //else
} //else
} //else atlest
if ($ret_norm)
return sprintf("%0.".$numdec."f",$num);
else
return sprintf("%s",$num); //print as is
} //print_num
并调用该函数(至少有两位小数,但最多 4 位:
print_num($mynum,2,true,4);
如果数字是 34.1,则得到 34.10
如果数字是 34.12345,您将得到 34.1235
等等
“23.555”.toFixed(2) 没有按照我的想法做吗? (Javascript)
刚刚遇到这个问题,解决方案是:只需添加零!
v=sprintf("%.2f",v) + 0;
print(v);
“+ 0”强制进行删除尾随零的数学运算。对于 PERL,我使用:
$v=sprintf("%.2f",$v) + 0;
print($v);
但对于其他语言,您可能需要添加 stringToFloat 的强制转换。