Perl格式化不起作用

时间:2017-03-03 19:12:02

标签: perl string-formatting

我的perl代码中有数字行,用于计算2变量

之间的差异
$diff = $upper- $lower;

变量upper和lower的值可以是decimal,fractional和exponential。

当我将此差异打印到文件时,我想保留格式,但想要在3位小数后截断小数值。我怎么能这样做?

例如在不同的情况下,

$diff =0.345664; I want to print as 0.346

$diff= 65.9787e-6; I want to print as 65.979e-06.

有人可以帮我怎么做吗?我正在使用%.3f但很明显它会陷入指数数字。

3 个答案:

答案 0 :(得分:1)

试试这个

printf "%.3f\n", $diff;

printf "%.3e\n", $diff;

顺便说一下,Perl中只有整数浮点数值

$diff = 0.345664;

printf "%.3f\n", $diff;

$diff = 65.9787e-6;

printf "%.3e\n", $diff;

输出

0.346
6.598e-005

没有一种格式说明符可以根据变量的值提供两种格式 - 您必须编写代码以自行做出决定

也无法使用65.98e-006格式获取6.598e-005而不是%e。小数点前总是有一个非零数字

答案 1 :(得分:1)

尽管有其他答案,但我觉得你想要的只是简单地使用%.3g,这将保留3个有效数字,但随后丢弃任何尾随的0。默认情况下,perl格式用于字符串化数字通常为%.15g

perl -e'printf "%.3g\n", $_ for 0.345664, 0.349876, 65.9787e-6, 6.59123e-5'
0.346
0.35
6.6e-05
6.59e-05

答案 2 :(得分:-1)

sub format1 { sprintf "%.3f", $_[0] }

say format1(0.345664);  # 0.346

sub format2 {
   sprintf("%.4e", $_[0])
      =~ s/\.(.)/$1./sr
         =~ s/([+-]\d\d)\z/ sprintf("%+03d", $1-1) /aer
}

say format2(65.9787e-6);  # 65.979e-06