|
sprintf 常见的用法是用来格式化浮点数,它使小数点后具有特定精度的数值,比如:
[code=perl]my $val = sprintf "%.2f", 2.338238;
print "$val\n";[/mw_shl_code]
输出:2.34
一个实例:
[code=perl]#!/usr/bin/perl
sub big_money {
foreach my $num (@_) {
$number = sprintf "%.2f", $num;
1 while $number =~ s/^(-?\d+)(\d\d\d)/$1,$2/;
$number =~ s/^(-?)/$1\$/;
print "$number\n";
}
}
&big_money(392032.3913, -3220923.189382, 38402340.101944);[/mw_shl_code]
运行输出:./sprintf.pl
$392,032.39
-$3,220,923.19
$38,402,340.10 上面例子为传递到 big_money 子程序中的几个表示金钱的浮点数的整数部分添加逗号和美元符号,添加逗号是为了更方便阅读。
在 big_meney 函数里,不能将 $number = sprintf "%.2f", $num; 写成 $number = sprintf "%.2f", $number;,否则会出现的错误。
使用 foreach 遍历整个参数数组 @_ 并将每次取得的值存在 $number 变量中。
1 while $number =~ s/^(-?\d+)(\d\d\d)/$1,$2/;
这个处理用来为整数部分添加逗号。其中 -? 表示整数部分是否匹配负数,后面的 (\d\d\d) 表示整数部分最右边的 3 位数字,正则匹配了就添加一逗号。while 循环前的 1 表示什么都不做,用别的数字代替也不会出错,它的作用只是让循环一直处理整数部分的添加逗号动作。
在为整数部分添加完逗号后,再在前面添加美元符号,如果是负数,则美元符号添加到负数的后面。
为什么不用 /g 修饰符进行全局查找与替换,以省下 1 while 循环造成的麻烦与困惑呢?
这是因为 /g 修饰符是从字符串开头进行依次处理的,而这里必须从整数的末端倒回处理,所以只用 s///g 是没办法完成的。 |
|