Javascript String.format

2008-04-17 11:57 | 分类 WebDev | By ming | 2 条评论 »

模仿.net的string.Format方法,进行字符串的格式化。主要是通过替换{数字}来实现。

方法一:

function format1() {
    var args = Array.prototype.slice.call(arguments);
    /*arguments不是Array,所以要转换成Array*/
    if (args.length < 2 || typeof args[0] != 'string')
        throw new Error('String Format Invalid');
    var format = args.shift();
    var l = args.length - 1;
    return format.replace(/\{(\d+)\}/g, function($0, $1) {
        if (l < $1)
            throw new Error('String Format Invalid');
        return args[$1];
    });
}

方法二:

function format2() {
    var args = Array.prototype.slice.call(arguments);
    if (args.length < 2 || typeof args[0] != 'string')
        throw new Error('String Format Invalid');
    var format = args.shift();
    var arr = format.match(/\{(\d+)\}/g);
    for (var i = 0, l = arr.length; i < l; i++) {
        format = format.replace(arr[i], args[i]);
    }
    return format;
}

/*此方法因欠缺考虑,只能用于逐个替换,现已废弃,请使用方法一

方法三:

function format3() {
    if (arguments.length < 2 || typeof arguments[0] != 'string')
        throw new Error('String Format Invalid');
    var format = arguments[0];
    var re = /\{(\d+)\}/g;
    for (var i = 1, l = arguments.length - 1; re.test(format); i++) {
        if (l < i)
            throw new Error('String Format Invalid');
        format = format.replace(re, arguments[i]);
    }
    return format;
}    */

经地测试(10000次循环),以上3个函数中format3性能最好(写的时候欠考虑,达不到format目的,此方法现已废弃),format1稍差,format2最差,

(30000次循环)情况下,不过估计没有人会一口气运行这么多次,format1也就比format3稍差一点。(诶,format1看起来多简洁啊,为啥不是最好的呢,看来String.prototype.replace(regexp,function)依靠它的内置循环也不见得是最好的)

使用:

format1('start-{0}-{1}-{2}-{3}-{4}-end','a','b','c','d','e'); 结果 'start-a-b-c-d-e-end'

像{{0}}、{{{0}}}这样的只会被替换成{'结果'},{{'结果'}}。


Tags:

转载请遵循"署名-非商业性使用-相同方式共享" 的创作共用协议。

     

    关于 Javascript String.format 有2条评论

  • AKFish

    你好
    你的format在if (!arguments[i])这里有个bug
    当传入的参数为数字0的时候
    !arguments[i]也会被转化为bool的true
    造成异常
    可把判断条件改为 arguments.length < i

  • ming

    嗯,那个的确是我欠考虑了,没有把无意义的几个''、undefined、null、0、false、NaN给考虑进去,谢谢提醒。
    决定把现在的format3给废弃了,测试不周到啊

    现在决定只用format1这个函数了

返回正文 |  用RSS订阅此页的评论

留下评论

(如发言后未显示则有待审核)