我有一个介于0.001和1000之间的随机数,我需要perl以5个字符的固定列宽打印它。也就是说,如果它太长,它应该是圆形的,如果它太短,它应该用空格填充。
我在网上找到的所有内容都建议使用sprintf,但如果数字太长,sprintf会忽略字段宽度。
有没有办法让perl这样做?
什么不起作用:
my $number = 0.001 + rand(1000);
my $formattednumber = sprintf("%5f", $number);
print <<EOF;
$formattednumber
EOF
答案 0 :(得分:4)
您需要动态定义Name: ConfigurationOfSoup-StephanEggermont.75
Author: StephanEggermont
Time: 14 December 2015, 1:39:52.307715 pm
UUID: 6c11fb83-5299-4852-9563-73ecc34992a0
Ancestors: ConfigurationOfSoup-FrancoisStephany.74
Adopted bug fix to stable 1.7.1 , added Pharo 5 versions
模式。小数位数取决于小数点左侧的位数。
此功能将为您完成。
package com.dannywind.delphi;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
public class BootReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent launchintent = new Intent();
launchintent.setClassName(context, "com.embarcadero.services.MyLocationService");
context.startService(launchintent);
}
}
输出可能是:
sprintf
答案 1 :(得分:1)
您可以在pack
之后使用sprintf
。它可能不是一种计算效率高的方法,但实现和维护起来相对简单:
my $formattednumber = pack ('A5', sprintf("%5f", $number));
答案 2 :(得分:0)
simbabque发布的答案并未涵盖所有案例,所以这是我的改进版本,以防任何人也需要这样的事情:
sub round_to_col {
my ( $number, $width ) = @_;
my $width_int = length int $number;
my $sprintf;
print "round_to_col error: number longer than width" if $width_int > $width;
$sprintf = "%d" if $width_int == $width;
$sprintf = "% d" if $width_int == $width - 1;
$sprintf = sprintf( '%%%d.%df', $width_int, $width - 1 - $width_int )
if $width_int < $width -1;
return sprintf( $sprintf , $number );
}