JScript实现的一个String.Format方法

本文介绍了一种在JavaScript中自定义StringHelper.Format方法的方法,该方法模仿了.NET Framework中的String.Format方法,支持变量插入和格式化字符串。文章还提供了一个示例实现,并展示了如何处理特殊字符。
  在.NET Framework的BCL类String中,有一个很有用的静态方法 String.Format。当我们在输出一个需要由多个变量条目来组成的字符串时,非常的有用。特别是在对多语言支持时,使用Format方法来显示更加有价值。为了方便脚本编程,下面实现了一个JScript版的Format方法。

    BCL中的String.Format()是一个变参数的方法,第一个参数为格式化字符串,从第二个参数开始为格式化条目中的替换值。由于JavaScript天生就支持任意参数个数,所以可以很自然的实现一个非常sexy的Format方法。

    StringHelper.Format()方法源代码如下:
None.gif  //  StringHelper.Format('{0}, {2}, {1}', 'abc', 'def', 'ghi');
None.gif //
 return "abc, ghi, def".
None.gif 
StringHelper.Format =  function(format)
None.gif {
None.gif     if ( arguments.length == 0 )
None.gif    {
None.gif         return '';
None.gif    }
None.gif     if ( arguments.length == 1 )
None.gif    {
None.gif         return String(format);
None.gif    }
None.gif
None.gif     var strOutput = '';
None.gif     for (  var i=0 ; i < format.length-2 ; )
None.gif    {
None.gif         if ( format.charAt(i) == '{' && format.charAt(i+1) != '{' )
None.gif        {
None.gif             var token = format.substr(i);
None.gif             var index = String(token.match(/\d+/));
None.gif             if ( format.charAt(i+index.length+1) == '}' )
None.gif            {
None.gif                 var swapArg = arguments[Number(index)+1];
None.gif                 if ( swapArg )
None.gif                {
None.gif                    strOutput += swapArg;
None.gif                }
None.gif                i += index.length+2;
None.gif            }
None.gif        }
None.gif         else
None.gif        {
None.gif             if ( format.charAt(i) == '{' && format.charAt(i+1) == '{' )
None.gif            {
None.gif                strOutput += format.charAt(i);
None.gif                i++
None.gif            }
None.gif            strOutput += format.charAt(i);
None.gif            i++;
None.gif        }
None.gif    }
None.gif    strOutput += format.substr(i);
None.gif     return strOutput.replace(/{{/g, '{').replace(/}}/g, '}');
None.gif }

    开始的时候我使用Regular Expression来替换,结果发现问题巨多,多到我只能放弃了,老老实实的遍历替换。如果要保留"{"或"}",使用double来转义,和BCL类库String.Format用法完全一致。

    使用如下测试代码:
None.gif  alert(StringHelper.Format('{0}{0}, {{2}}, {{1}}', 'abc', 'def', 'ghi')); 
None.gif
None.gif  alert(StringHelper.Format('{0}, {{2}}, {1}', 'abc', 'def', 'ghi')); 
None.gif
None.gif  alert(StringHelper.Format('{{0}}\r\n, {2}\r\n, {1}', 'abc', 'def', 'ghi')); 
None.gif
None.gif  alert(StringHelper.Format('{0}{0}{{00}{0}, {{1}}, {{2}}', 'abc', 'def'));

    结果为:
None.gif No.1 alert: abcabc, {2}, {1}
None.gif
None.gif No.2 alert: abc, {2}, def None.gif
None.gif
None.gif No.3 alert: {0} None.gif
None.gif                , ghi None.gif
None.gif                , def
None.gif
None.gif No.4 alert: abcabc{00}abc, {1}, {2}

    您还有更好更高效的实现办法吗?


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值