曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3662|回复: 0
打印 上一主题 下一主题

sprintf -- 格式化数据

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-10-13 11:22:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;,否则会出现
"Modification of a read-only value"
的错误。

使用 foreach 遍历整个参数数组 @_ 并将每次取得的值存在 $number 变量中。

1 while $number =~ s/^(-?\d+)(\d\d\d)/$1,$2/;
这个处理用来为整数部分添加逗号。其中 -? 表示整数部分是否匹配负数,后面的 (\d\d\d) 表示整数部分最右边的 3 位数字,正则匹配了就添加一逗号。while 循环前的 1 表示什么都不做,用别的数字代替也不会出错,它的作用只是让循环一直处理整数部分的添加逗号动作。

在为整数部分添加完逗号后,再在前面添加美元符号,如果是负数,则美元符号添加到负数的后面。

为什么不用 /g 修饰符进行全局查找与替换,以省下 1 while 循环造成的麻烦与困惑呢?
这是因为 /g 修饰符是从字符串开头进行依次处理的,而这里必须从整数的末端倒回处理,所以只用 s///g 是没办法完成的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-26 01:02 , Processed in 0.059109 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表