国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

在js中做數字字符串補0(js補零)

2024-05-06 15:19:20
字體:
來源:轉載
供稿:網友

通常遇到的一個問題是日期的“1976-02-03 HH:mm:ss”這種格式 ,我的比較簡單的處理方法是這樣:

function formatDate(d) { var D=['00','01','02','03','04','05','06','07','08','09'] with (d || new Date) return [  [getFullYear(), D[getMonth()+1]||getMonth()+1, D[getDate()]||getDate()].join('-'),  [D[getHours()]||getHours(), D[getMinutes()]||getMinutes(), D[getSeconds()]||getSeconds()].join(':') ].join(' ');}

這種方法是邏輯比較簡單的,而且規則也簡單。除了with(d||new Date)的使用之外,也算不上什么技巧。但是,如果用這種方法來做數字字符串補0,那么結果顯然不妙。51js的月影提供了另一個方案:

function pad(num, n) { return Array(n>num?(n-(''+num).length+1):0).join(0)+num;}

調用示例如下:

pad(100, 4); // 輸出:0100

月影在這里分析了其中的技巧,以及代碼長短與效率上的平衡:
最后月影推薦的是“質樸長存法”:

/* 質樸長存法 by lifesinger */function pad(num, n) {  var len = num.toString().length;  while(len < n) {    num = "0" + num;    len++;  }  return num;}

這個在“沒事就射鳥”同學的博客里做了分析
月影同學有一件事是沒有做的,就是沒說明“為什么那個短代碼的效率更低?”。
答案是“表面看來,用array.join來替代循環是高效的,但忘掉了一個數組創建的開銷”。對此有沒有法子呢?我有過另一個解決的思路。如下:

/* 查表法(不完善) by aimingoo */pad = function(tbl) { return function(num, n) {  return (((tbl[n = n-num.toString().length]) || (tbl[n] = Array(n).join(0))) + num); }}([]);

這個路子跟前面的formatDate()是一樣的,只不是formatDate()里的表是一個確定的數組,而這里的數組則是動態生成,然后緩存在tbl[]里面。這個緩存的tbl[]數組是使用一個函數調用參數的形式,保持在最終的pad()函數的上層閉包里面。為了讓上面的這個過程清晰一點,我重排代碼格式如下:

pad = function(tbl) { return function(num, n) {  return (   ((tbl[n = n-num.toString().length]) ||    (tbl[n] = Array(n).join(0))) +   num  ); }}([]);

好的。到這里,先別急,還有兩個問題要解決。其一,當不需要補0時,上述的tbl[0]返回空值,所以會進入到“||”運算的第二個分支,因此導致Array()重算一次,也就是說“不補0的情況效率其實最低”。其二,當num長度大于n時,也就變成了“補負數個零”。“補負數個零”顯然不行,一般對此處理成“不需要補零”,于是又回到了第一個問題。

這兩個問題可以一次解決,其實就是多一次判斷:

/* 查表法(完善版本) by aimingoo */pad = function(tbl) { return function(num, n) {  return (0 >= (n = n-num.toString().length)) ? num : (tbl[n] || (tbl[n] = Array(n+1).join(0))) + num; }}([]);            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 双鸭山市| 洪洞县| 保靖县| 当阳市| 富蕴县| 房山区| 都安| 昭通市| 嘉黎县| 故城县| 大田县| 乐至县| 定襄县| 昌图县| 龙江县| 中山市| 柏乡县| 大理市| 开平市| 锦州市| 南平市| 个旧市| 汪清县| 衡山县| 和硕县| 辽宁省| 横峰县| 武宣县| 昭通市| 沈丘县| 股票| 武山县| 洪湖市| 闻喜县| 金昌市| 开鲁县| 杨浦区| 南澳县| 平邑县| 商南县| 桑日县|