String.prototype.format2 = function (args) {
var s = this, vals = [], rst = [], pattern = /({|})/g, ms = s.match(pattern);
var err = ['输入字符串的格式不正确。', '索引(从零开始)必须大于或等于零,且小于参数列表的大小。', '值不能为null。', '格式说明符无效。'];
if (ms.length % 2 != 0) {
throw new Error(err[0]);
}
var matchs = s.match(/({+[-\d]+(:[\D\d]*?)*?}+)|({+([\D]*?|[:\d]*?)}+)|({{[\w]*?)|([\w]*?}})/g);
if (matchs != null) {
if (arguments.length > 1) {
for (var i = 0, c = arguments.length; i < c; i++) {
if (arguments[i] != undefined) {
vals.push(arguments[i]);
}
}
} else if (Object.prototype.toString.call(args) === '[object Array]') {
vals = args;
} else if (args != undefined && args != null) {
vals.push(args);
}
var len = vals.length;
for (var i = 0, c = matchs.length; i < c; i++) {
var _t = matchs[i], _tv = _t.replace(pattern, ''), _p = s.indexOf(_t), idx = parseInt(_tv, 10);
var _c = /{/g.test(_t) ? _t.match(/{/g).length : 0, _d = /}/g.test(_t) ? _t.match(/}/g).length : 0;
var _t1 = _t.replace(/{{/g, '{').replace(/}}/g, '}');
var _single = _c % 2 != 0 || _d % 2 != 0;
if (!isNaN(idx)) {
var _v = _tv._formatNumber(vals[idx], err);
if (typeof _v == 'boolean' && !_v) {
return false;
}
if (/^-\d$/g.test(_tv) && _single) {
throw new Error(err[0]);
} else if (idx >= len) {
throw new Error(err[1]);
} else if (_v == null) {
throw new Error(err[2]);
}
rst.push(s.substr(0, _p) + (_c > 1 ? (_c % 2 != 0 ? _t1.replace('{' + idx + '}', _v) : _t1) : _v));
} else if (_single) {
throw new Error(err[0] + '01');
} else {
rst.push(_t1);
}
s = s.substr(_p + _t.length);
}
rst.push(s);
return rst.join('');
}
return s;
};
String.prototype._formatNumber = function (_v, err) {
var _tv = this;
if (/[:]/g.test(_tv)) {
var _sc = _tv.match(/(:)/g).length;
if (_sc == 1) {
var _ss = _tv.split(':')[1];
if (typeof _v == 'number') {
var _p1 = /([CDEFG])/ig, _p2 = /([A-Z])/ig,_p3 = /^([CDEFG][\d]+)$/ig, _p4 = /^([A-Z]{1}[\d]+)$/ig;
if ((_ss.length == 1 && _p1.test(_ss))||(_ss.length >= 2 && _p3.test(_ss))){
var _f1 = _ss.substr(0, 1), _f = _f1.toUpperCase();
var _n = parseInt(_ss.substr(1), 10)||(_f=='D'?0:2), _dn = ('' + _v).split('.');
_v = (''+_v)._formatNumberSwitch(_f1, _f, _n, _dn);
} else if((_ss.length == 1 && _p2.test(_ss)) || (_ss.length >= 2 && _p4.test(_ss))){
throw new Error(err[3]);
return false;
} else if(/([0]+)/g.test(_ss)){
var _nv = Math.round(_v, 10), _arv = _ss.split(''), _arn = (''+_nv).split('');
_v = _tv._formatNumberZero(_arv, _arn);
} else {
_v = _ss;
}
}
} else {
if (typeof _v == 'number') {
var _nv = Math.round(_v, 10),_pos = _tv.indexOf(':'), _arv = _tv.substr(_pos+1).split(''), _arn = (''+_nv).split('');
_v = _tv._formatNumberZero(_arv, _arn);
} else{
_v = _tv.substr(_tv.indexOf(':') + 1);
}
}
}
return _v;
};
String.prototype._formatNumberSwitch = function(_f1, _f, _n, _dn){
var _v = this;
if(_dn[1]==undefined && (_f=='C'||_f=='F')){
_dn[1] = '';
_v += _n > 0 ? '.' : '';
}
switch (_f) {
case 'C':
_vc = '¥' + _v;
var _m = _dn[0].length % 3;
if (_dn[0].length > 3) {
_v = _vc.substr(0, _m + 1);
var _pos = _m + 1;
while (_pos < _dn[0].length - 1) {
_v += ',' + _vc.substr(_pos, 3);
_pos += 3;
}
_v += _vc.substr(_pos);
} else {
_v = _vc;
}
for (var i = 0, c = _n - (_dn[1]).length; i < c; i++) {_v += '0';}
break;
case 'D':
if (/([.])/g.test(_v)) {
throw new Error(err[3]);
return false;
}
for (var i = 0, c = _n - (''+_v).length; i < c; i++) {_v = '0' + _v;}
break;
case 'E':
var _n = _dn[0].length - 1, _fn = parseInt(('' + _v).substr(0, 1), 10), _num = Math.pow(10, _n), _e = Math.pow(10, 5);
var _cn = (Math.round((_v - _num) / _num * _e) / _e + '').split('.')[1],_ln = '';
for (var i = ('' + _cn).length; i < 5; i++) {_cn += '0';}
for (var i = ('' + _n).length; i < 3; i++) {_n = '0' + _n;}
_v = _fn + '.' + _cn + _f1 + '+' + _n;
break;
case 'F':
for (var i = 0, c = _n - _dn[1].length; i < c; i++) {_v += '0';}
break;
}
return _v;
};
String.prototype._formatNumberZero = function(_arv, _arn){
var _arr = [], _idx = _arn.length -1;
for(var i=_arv.length-1; i>=0;i--){
_arr.push(_arv[i]=='0' ? (_idx >=0 ? _arn[_idx] : _arv[i]) : (function(){++_idx;return _arv[i];})());
_idx--;
}
for(var i=_idx; i>=0; i--){_arr.push(_arn[i]);}
_arr = _arr.reverse ();
return _arr.join('');
};
//demo
var str = '你好:{0},这是用{0}写的一个仿C#的{1}函数';
console.log(str.format2(['JS','format']));
console.log(str.format2('JS','format'));
console.log("{0}{{正则{0:C5}{{表达式}}{1:F4}".format2(123.5, 12.5))
console.log("{0}{{正则{0:E5}{{表达式}}{1:0D12}".format2(123.5, 2))
console.log("{0:00:00:00}".format2(1234567));
console.log("{0:0000-00-00 00:00:00}".format2(20160824172215));
console.log("{0:0000年00月00日 00:00:00}".format2(20160824172215));
console.log("{0:0DF5}".format2(1234567));
没有合适的资源?快使用搜索试试~ 我知道了~
js写的string.format函数
共1个文件
js:1个
需积分: 50 12 下载量 189 浏览量
2016-08-25
09:20:38
上传
评论
收藏 2KB RAR 举报
温馨提示
js 写的string format函数,功能模仿C#中的string.Format方法,已实现(整数 :D、小数:F、货币数字:C、科学计数:E 等4种)数字格式化。参数可以传递数组,也可以传多个参数。
资源推荐
资源详情
资源评论
收起资源包目录
format2.rar (1个子文件)
format2.js 6KB
共 1 条
- 1
资源评论
qingfeng526
- 粉丝: 12
- 资源: 42
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功