在js中做數字字串補0

來源:互聯網
上載者:User

標籤:

轉自(http://blog.csdn.net/aimingoo/article/details/4492592)

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

 

[javascript] view plaincopy 
  1. function formatDate(d) {  
  2.   var D=[‘00‘,‘01‘,‘02‘,‘03‘,‘04‘,‘05‘,‘06‘,‘07‘,‘08‘,‘09‘]  
  3.   with (d || new Date) return [  
  4.     [getFullYear(), D[getMonth()+1]||getMonth()+1, D[getDate()]||getDate()].join(‘-‘),  
  5.     [D[getHours()]||getHours(), D[getMinutes()]||getMinutes(), D[getSeconds()]||getSeconds()].join(‘:‘)  
  6.   ].join(‘ ‘);  
  7. }  

 

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

 

[javascript] view plaincopy 
  1. function pad(num, n) {  
  2.   return Array(n>num?(n-(‘‘+num).length+1):0).join(0)+num;  
  3. }  


調用樣本如下:

 

 

[javascript] view plaincopy 
  1. pad(100, 4);  // 輸出:0100  


月影在這裡分析了其中的技巧,以及代碼長短與效率上的平衡:

 

http://hi.baidu.com/akira_cn/blog/item/90ba2a8b07c867dafc1f1045.html

 

最後月影推薦的是“質樸長存法”:

 

[javascript] view plaincopy 
  1. /* 質樸長存法  by lifesinger */  
  2. function pad(num, n) {  
  3.     var len = num.toString().length;  
  4.     while(len < n) {  
  5.         num = "0" + num;  
  6.         len++;  
  7.     }  
  8.     return num;  
  9. }  



 

這個在“沒事就射鳥”同學的部落格裡做了分析:

http://lifesinger.org/blog/2009/08/the-harm-of-tricky-code/

 

月影同學有一件事是沒有做的,就是沒說明“為什麼那個短代碼的效率更低?”。

答案是“表面看來,用array.join來替代迴圈是高效的,但忘掉了一個數組建立的開銷”。對此有沒有法子呢?我有過另一個解決的思路。如下:

 

[javascript] view plaincopy 
  1. /* 查表法(不完善)  by aimingoo */  
  2. pad = function(tbl) {  
  3.   return function(num, n) {  
  4.     return (((tbl[n = n-num.toString().length]) || (tbl[n] = Array(n).join(0))) + num);  
  5.   }  
  6. }([]);  



 

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

 

[javascript] view plaincopy 
  1. pad = function(tbl) {  
  2.   return function(num, n) {  
  3.     return (  
  4.       ((tbl[n = n-num.toString().length]) ||  
  5.        (tbl[n] = Array(n).join(0))) +  
  6.       num  
  7.     );  
  8.   }  
  9. }([]);  



 

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

 

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

 

[javascript] view plaincopy 
  1. /* 查表法(完善版本)  by aimingoo */  
  2. pad = function(tbl) {  
  3.   return function(num, n) {  
  4.     return (0 >= (n = n-num.toString().length)) ? num : (tbl[n] || (tbl[n] = Array(n+1).join(0))) + num;  
  5.   }  
  6. }([]);  



 

當然,也可以象前面一樣整理一下這個代碼格式。或者,採用一個完全不用“(函數式語言的)連續運算等技巧”的版本:

 

[javascript] view plaincopy 
  1. /* 查表法(過程式版本)  by aimingoo */  
  2. pad = function() {  
  3.   var tbl = [];  
  4.   return function(num, n) {  
  5.     var len = n-num.toString().length;  
  6.     if (len <= 0) return num;  
  7.     if (!tbl[len]) tbl[len] = (new Array(len+1)).join(‘0‘);  
  8.     return tbl[len] + num;  
  9.   }  
  10. }();  



 

演算法永遠都是如此,要不是時間換空間,要不就是空間換時間。射鵰同學的“質樸長存法”是時間換空間的方法,而這裡的查表法則是空間換時間的方案。這個函數會在tbl中持續一個字串數組,如果num是非常經常變化的,那麼效率也不會有太大提升——對於過於頻繁變化的系統,緩衝就意義不大了。其實邏輯都差不多,月影同學只是少走了一步而已。

在js中做數字字串補0

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.