来源:远方网络 | 2005-12-23 14:08:58 | (有3471人读过)
近来一直在研究 SVG,发现软件(如Illustrator)生成的SVG中的数据小数位数太多了,没必要如此精确,于是心想能否自动处理一下里面的数据,让所有的数都四舍五入精简一下,我头一个想到的就是我所熟悉的正则表达式,可我所接触到的javascript中的正则表达式(因为在html中就能执行,故没考虑在Perl或Java中使用)好像还没有能方便处理这种情况的方法,于是今天 google 了一下,但一开始也没看到自己想要的东西,但看到字符串replace方法的时候,心想javascript是不是存在 replace(rexp, function) 的用法,于是,用“javascript regular expression replace function”搜索了一下,果真发现了在mozilla网站上的 Core JavaScript 1.5 Reference 中提到了 replace(rexp, function) 的用法,看了例子后,稍微研究了一下,发现其中 function的参数是这样的: arguments[0], 匹配的串源 arguments[1] ... arguments[arguments.length -3],匹配()内容,相当于常用的 $1, $2... arguments[arguments.length -2],匹配串的位置偏移 offset arguments[arguments.length -1],整个字符串源
对于SVG中的某自动生成的点数据,把数据赋值给变量 points: var points="1.23456,2.34534 3.47804-4.824-5.270213,6.009324"; 定义正则表达式 var rexp = /(\-?[0-9]+(\.([0-9]+))?)/g; 通过 points = points.replace(rexp, function(){ return Math.floor(parseFloat(arguments[1])*100 +0.5)/100; }); 最后得到的 points="1.23,2.35 3.48-4.82-5.27,6.01",正是我想要的效果。玩了好几年的JavaScript,其实也有碰到过类似的问题,竟然没发现 replace 的这个功能,真是遗憾。
(这里的例子取了两位小数,其实对于精度要求不是太高的SVG里,一位小数应该就足够了。)
|