一、项目需求
1 1、顺序替换--“您确定要花费{money}金币,来购买{amount}个红瓶吗?”
2 2、全局替换--“{name},奖励所有人{money}人民币和{exp}美元。呵呵。”
二、函数的基本轮廓
1 public function printf( str:String, ... rest ):String
2 {
3 //... parse
4 return string;
5 }
三、顺序替换的实现
我们可以用正则来描述顺序替换中需要替换的关键词:\{[a-z0-9_]+\}
这个正则所表示的意思:所以形如{字母/数字/下划线}的内容,并且你可能需要忽略大小写,最终为:/\{[a-z0-9_]+\}/i
接着,我们只要用一个循环来遍历替换参数指定的值就行了。
扩展:我们不但可以将rest直接传入多个数据参数,也可以传入将这些数据参数整合成一个数组来只传入一个参数
四、全局替换的分析
由于字符串替换方法replace好像只能替换第一个匹配的项,因此我们还得借助正则表达式来实现。
实现方法:参数rest我们传入一个Object,例如{name:"天地会"},而这个Object的字段名与全局替换中的关键词{XXX}是相互对应的。如此就简单了,我们只要遍历这个Object,替换源字符串中所有相对应的关键词即可。
五、最终代码
1 package
2 {
3
4 /**
5 * 使用传入的各个参数替换指定的字符串内的 <code>{n}</code> 标记。
6 *
7 * @param str - 用来进行替换的源字符串。
8 * @param rest - 可在 str 参数中的每个 <code>{n}</code> 位置被替换的值。
9 * 如果第一个参数是一个数组,则该数组将用作参数列表。若第一个参数为数据对象,则会进行全局替换,否则为顺序替换。
10 *
11 * <p>源字符串可包含 <code>{n}</code> 形式的特殊标记,其中 n 为任意标识符(由字母、数字、下划线组成),
12 * 它将被替换成具体的值。</p>
13 * <p>因为允许 rest 第一个参数为数组,因此允许在其它想要使用... rest 参数的方法中重复使用此例程。例如:
14 * <table><tr><td style="padding:10px;color:#334455"><code>
15 * public function myTracer(str:String, ... rest):void<br>
16 * {<br>
17 * label.text += printf(str, rest) + "\n";<br>
18 * }
19 * </code></td></tr></table><p>
20 *
21 * @return 使用指定的各个参数替换了所有 <code>{n}</code> 标记的新字符串。
22 *
23 * <table><tr><td style="padding:10px;color:#334455"><code>
24 * var str:String = "here is some info {number} and {boolean}";<br>
25 * trace(printf(str, 15.4, true));<br>
26 * <br>
27 * // this will output the following string:<br>
28 * // "here is some info 15.4 and true"<br>
29 * </code></td></tr></table>
30 */
31 public function printf( str:String, ... rest ):String
32 {
33 if( str == null || str == "" )
34 return "";
35
36 var lng:int; // 最终需要计算替换的次数
37 var args:Array; // 最终需要替换的数据
38 var i:int;
39
40 switch( typeof( rest[ 0 ]))
41 {
42 case "number":
43 case "boolean":
44 case "string":
45 {
46 lng = rest.length;
47 args = rest;
48
49 for( i = 0; i < lng; i++ )
50 {
51 str = str.replace( PATTERN_PRINTF, args[ i ]);
52 }
53 break;
54 }
55 case "object":
56 {
57 if( rest[ 0 ] is Array )
58 {
59 args = rest[ 0 ] as Array;
60 lng = args.length;
61
62 for( i = 0; i < lng; i++ )
63 {
64 str = str.replace( PATTERN_PRINTF, args[ i ]);
65 }
66 }
67 else
68 {
69 var reg:RegExp;
70
71 for( var prop:String in rest[ 0 ])
72 {
73 reg = new RegExp( "\{" + prop + "\}", "ig" );
74 str = str.replace( reg, rest[ 0 ][ prop ]);
75 }
76 }
77 break;
78 }
79 }
80
81 return str;
82 }
83 }
84
85 const PATTERN_PRINTF:RegExp = /\{[a-z0-9_]+\}/i;
你可以直接将以上代码,保存为一个AS3文件,来放到你的项目中使用。
注:养成写注释的习惯,是你成功和成长的其中一步。
六、使用方法
1 trace( printf( "您确定要花费{money}金币,来购买{amount}个红瓶吗?", 100, 5 ));
2 trace( printf( "{name},奖励所有人{money}人民币和{exp}美元。呵呵。", { name: "看完这篇文章", money: 100, exp: 2000 }));
输出结果:
1 您确定要花费100金币,来购买5个红瓶吗?
2 看完这篇文章,奖励所有人100人民币和2000美元。呵呵。