javascript中实现 C# 的 format函数例子

2016-02-22    编辑:ai405201414     点击(
javascript中实现 C# 的 format方法例子非常的简单,我下面给各位整理两个方法,希望能帮助到各位同学,有兴趣的不防进入参考一下。

编者: 今天给大家分享一个js实现的类似C#的format方法。实现字符串的格式化输出,对字符串转换、格式化展示有很大的帮助。

正文:

直接上代码:

 

 代码如下 复制代码
String
.prototype.format =
function
(args)
 {
    
var
 _dic =
typeof
 args ===
"object"
 ? args :
arguments
;
    
return
 
this
.replace(
/\{([^{}]+)\}/g
,
function
(str, key)
 {
        
return
 _dic[key] || str;
    });
}
var
 str =
"参数{0}参数{1}参数{3}参数{hehe}参数{{fuck}}参数{ooxx}"
;
console.log( str.format(
"001"
,
"002"
) );
// 参数001参数002参数{3}参数{hehe}参数{{fuck}}参数{ooxx}
console.log( str.format([
"001"
,
"002"
]) );
// 参数001参数002参数{3}参数{hehe}参数{{fuck}}参数{ooxx}
console.log( str.format({hehe:
"呵呵"
, fuck:
"法克"
}) );
// 参数{0}参数{1}参数{3}参数呵呵参数{法克}参数{ooxx}
console.log( str.format({
"1"
:
"111"
, hehe:
"呵呵"
, ooxx:
"哈哈"
}) );

// 参数{0}参数111参数{3}参数呵呵参数{{fuck}}参数哈哈
代码简洁易懂,维护起来也很轻松,而且支持 3 种格式的参数替换。
但是也不是无懈可击的,因为我的思路和原文完全相反。

思路是这样的,利用正则匹配出字符串内所有 {key} 这样的格式字符,然后把 key 当作对象对应的key或者数组对应的下标进行替换。
第一行  var _dic = typeof args === "object" ? args : arguments;  可以接受 3 种格式的数据。
多参数: arguments
数组: []
对象: {}
把这3种数据当作字典保存在 _dic 变量里。

下面正则替换替换函数里,其实就是进行查字典操作。
 return _dic[key] || str;
如果 _dic[key] 对应数据存在,就替换,否则就返回原始数据。
因为 arguments, [], {} 都可以当作字典来处理,所以就可用最简单方法实现这种效果了。

同时缺陷也非常明确的暴露了,就是如果字符串里 {key} 这种参数非常多,但是替换的数据却很少的时候,性能肯定不如他的方法。
但我觉得一般操作肯定都是参数对应进行替换的,这样性能损耗就不用担心了,因为对应了参数,损耗就是0。
反而比他那个多次正则替换来的快呢。

测试好了上面的那个firefox下出问题,因为firefox的全局正则和IE不太一样这里改了一下

 代码如下 复制代码

var str = "{0}aaa,b{{0}}bb,d{{a}}dd,c{{{0}}}cc{{0}},{{{{1},aaa,{1}}}}},ccc,{1}eee,{{1}},{{2}}\"ccc\"" 
//var str = "{0} {1}:AAA:CCC"  
var data = ["tx{1}t1", "tx{{0}}t2"]; 
str = StringFormat(str, data); 
alert(str); 

function StringFormat (str, list) {
    var data = list;
    var strArray = str.split("");
    for (var i = 0; i < data.length; i++) {
        var strReg = "(\\{+" + i + "\\}+)";
        var reg = new RegExp(strReg, "g");

        while (true) {
            var exec = reg.exec(str);
            if (null == exec)
                break;

            var start = exec[0].match(/{+/g);
            var end = exec[0].match(/}+/g);
            var findStr = exec[0].replace(/{{/g, "{").replace(/}}/g, "}");
            var lastIndex = exec.index + exec[0].length;

            for (var strIndex = exec.index; strIndex < lastIndex; strIndex++) {
                strArray[strIndex] = "";
            }

            if (start[0].length % 2 > 0 &&
                end[0].length % 2 > 0) {
                strArray[exec.index] = findStr.replace(/{\d+}/g, data[i]);
            }
            else {
                strArray[exec.index] = findStr;
            }
        }
    }

    str = strArray.join("");

    return str;
}