1 /**
  2  * format 扩展包
  3  */
  4 Jx().$package(function(J){
  5     
  6     /**
  7      * number 名字空间
  8      * 
  9      * @namespace
 10      * @name format
 11      * @type Object
 12      */
 13     J.format = J.format || {};
 14     
 15     /**
 16      * 让日期和时间按照指定的格式显示的方法
 17      * @method date
 18      * @memberOf format
 19      * @param {String} format 格式字符串
 20      * @return {String} 返回生成的日期时间字符串
 21      * 
 22      * @example
 23      * Jx().$package(function(J){
 24      *     var d = new Date();
 25      *     // 以 YYYY-MM-dd hh:mm:ss 格式输出 d 的时间字符串
 26      *     J.format.date(d, "YYYY-MM-DD hh:mm:ss");
 27      * };
 28      * 
 29      */
 30     var date = function(date, formatString){
 31         /*
 32          * eg:formatString="YYYY-MM-DD hh:mm:ss";
 33          */
 34         var o = {
 35             "M+" : date.getMonth()+1,    //month
 36             "D+" : date.getDate(),    //day
 37             "h+" : date.getHours(),    //hour
 38             "m+" : date.getMinutes(),    //minute
 39             "s+" : date.getSeconds(),    //second
 40             "q+" : Math.floor((date.getMonth()+3)/3),    //quarter
 41             "S" : date.getMilliseconds()    //millisecond
 42         }
 43     
 44         if(/(Y+)/.test(formatString)){
 45             formatString = formatString.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
 46         }
 47     
 48         for(var k in o){
 49             if(new RegExp("("+ k +")").test(formatString)){
 50                 formatString = formatString.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
 51             }
 52         }
 53         return formatString;
 54     };
 55     
 56     /**
 57      * @memberOf format
 58      * @method number
 59      * 格式化数字显示方式
 60      * @param num 要格式化的数字
 61      * @param pattern 格式
 62      * @example 
 63      * J.format.number(12345.999,'#,##0.00');
 64      *  //out: 12,34,5.99
 65      * J.format.number(12345.999,'0'); 
 66      *  //out: 12345
 67      * J.format.number(1234.888,'#.0');
 68      *  //out: 1234.8
 69      * J.format.number(1234.888,'000000.000000');
 70      *  //out: 001234.888000
 71      */  
 72     var number = function(num, pattern) {
 73         var strarr = num ? num.toString().split('.') : ['0'];
 74         var fmtarr = pattern ? pattern.split('.') : [''];
 75         var retstr = '';
 76     
 77         // 整数部分
 78         var str = strarr[0];
 79         var fmt = fmtarr[0];
 80         var i = str.length - 1;
 81         var comma = false;
 82         for (var f = fmt.length - 1; f >= 0; f--) {
 83             switch (fmt.substr(f, 1)) {
 84                 case '' :
 85                     if (i >= 0)
 86                         retstr = str.substr(i--, 1) + retstr;
 87                     break;
 88                 case '0' :
 89                     if (i >= 0)
 90                         retstr = str.substr(i--, 1) + retstr;
 91                     else
 92                         retstr = '0' + retstr;
 93                     break;
 94                 case ',' :
 95                     comma = true;
 96                     retstr = ',' + retstr;
 97                     break;
 98             }
 99         }
100         if (i >= 0) {
101             if (comma) {
102                 var l = str.length;
103                 for (; i >= 0; i--) {
104                     retstr = str.substr(i, 1) + retstr;
105                     if (i > 0 && ((l - i) % 3) == 0)
106                         retstr = ',' + retstr;
107                 }
108             } else
109                 retstr = str.substr(0, i + 1) + retstr;
110         }
111     
112         retstr = retstr + '.';
113         // 处理小数部分
114         str = strarr.length > 1 ? strarr[1] : '';
115         fmt = fmtarr.length > 1 ? fmtarr[1] : '';
116         i = 0;
117         for (var f = 0; f < fmt.length; f++) {
118             switch (fmt.substr(f, 1)) {
119                 case '' :
120                     if (i < str.length)
121                         retstr += str.substr(i++, 1);
122                     break;
123                 case '0' :
124                     if (i < str.length)
125                         retstr += str.substr(i++, 1);
126                     else
127                         retstr += '0';
128                     break;
129             }
130         }
131         return retstr.replace(/^,+/, '').replace(/\.$/, '');
132     };
133     
134     J.format.date = date;
135     J.format.number = number;
136     
137 });
138