2010-05-19 43 views
5

Tôi đã xem this format function được tham chiếu trên một số trang web, nhưng không ai trong số chúng có ví dụ rõ ràng về cách chuyển số vào hàm.Đi qua số, Number.prototype.format

Tôi đã thử '12345'.format (' 0.00 ') mà tôi tin là viết nó như thế nào, nhưng nó cho tôi lỗi rằng đối tượng không hỗ trợ thuộc tính hoặc phương pháp. Tôi cũng đã thử số ('12345'). Định dạng ('0.00'); var num = '12345' // num.format ('0.00'); định dạng ('0.00', '12345') và thậm chí đã thử sử dụng các số thay vì chuỗi 12345.format (0.00). Tôi có thiếu một cái gì đó thực sự rõ ràng ở đây?

Đã bao gồm bản sao chức năng để tham khảo, do đó bạn không cần phải truy cập trang web (với tất cả các phần còn thiếu được điền).

/** 
* I ♥ Google 
*/ 
String.prototype.stripNonNumeric = function() { 
    var str = this + ''; 
    var rgx = /^\d|\.|-$/; 
    var out = ''; 
    for(var i = 0; i < str.length; i++) { 
     if(rgx.test(str.charAt(i))) { 
      if(!((str.charAt(i) == '.' && out.indexOf('.') != -1) || 
      (str.charAt(i) == '-' && out.length != 0))) { 
       out += str.charAt(i); 
      } 
     } 
    } 
    return out; 
}; 

/** 
* Formats the number according to the 'format' string; adherses to the american number standard where a comma is inserted after every 3 digits. 
* note: there should be only 1 contiguous number in the format, where a number consists of digits, period, and commas 
*  any other characters can be wrapped around this number, including '$', '%', or text 
*  examples (123456.789): 
*   '0' - (123456) show only digits, no precision 
*   '0.00' - (123456.78) show only digits, 2 precision 
*   '0.0000' - (123456.7890) show only digits, 4 precision 
*   '0,000' - (123,456) show comma and digits, no precision 
*   '0,000.00' - (123,456.78) show comma and digits, 2 precision 
*   '0,0.00' - (123,456.78) shortcut method, show comma and digits, 2 precision 
* 
* @method format 
* @param format {string} the way you would like to format this text 
* @return {string} the formatted number 
* @public 
*/ 
Number.prototype.format = function(format) { 
    if (!(typeof format == "string")) {return '';} // sanity check 

    var hasComma = -1 < format.indexOf(','), 
     psplit = format.stripNonNumeric().split('.'), 
     that = this; 

    // compute precision 
    if (1 < psplit.length) { 
     // fix number precision 
     that = that.toFixed(psplit[1].length); 
    } 
    // error: too many periods 
    else if (2 < psplit.length) { 
     throw('NumberFormatException: invalid format, formats should have no more than 1 period: ' + format); 
    } 
    // remove precision 
    else { 
     that = that.toFixed(0); 
    } 

    // get the string now that precision is correct 
    var fnum = that.toString(); 

    // format has comma, then compute commas 
    if (hasComma) { 
     // remove precision for computation 
     psplit = fnum.split('.'); 

     var cnum = psplit[0], 
      parr = [], 
      j = cnum.length, 
      m = Math.floor(j/3), 
      n = cnum.length % 3 || 3; // n cannot be ZERO or causes infinite loop 

     // break the number into chunks of 3 digits; first chunk may be less than 3 
     for (var i = 0; i < j; i += n) { 
      if (i != 0) {n = 3;} 
      parr[parr.length] = cnum.substr(i, n); 
      m -= 1; 
     } 

     // put chunks back together, separated by comma 
     fnum = parr.join(','); 

     // add the precision back in 
     if (psplit[1]) {fnum += '.' + psplit[1];} 
    } 

    // replace the number portion of the format with fnum 
    return format.replace(/[\d,?\.?]+/, fnum); 
}; 

Trả lời

1

Đó không phải là mã hoàn chỉnh - đó là mất tích isTypestripNonNumeric phương pháp. Nhưng dù sao, vì nó là một phần mở rộng trên Số đối tượng riêng của mình, bạn có thể sử dụng nó như:

(42).format('0.00'); 

hoặc

var a = 42; 
a.format('0.00'); 

'12345'.format('0.00') sẽ không làm việc như '12345' đây là một chuỗi, nhưng phương pháp này đã được được chỉ định cho một số.

Hãy xem điều này question vì lý do bạn cần kèm theo số trong dấu ngoặc đơn và cách bạn có thể vượt qua nó mà không sử dụng chúng, mặc dù tôi sẽ không khuyên bạn - nguyên nhân của tất cả những tin đồn này về lập trình và trục bảo trì. Tôi không nói rằng mọi lập trình viên bảo trì đều mang theo một trong ba lô của họ, nhưng tại sao lại có cơ hội. Họ yêu hacking quá nhưng không phải với mã .. hahahaha

+1

Thực ra bạn không phải kèm theo số trong dấu ngoặc đơn - bạn chỉ cần để lại dấu cách giữa số và dấu chấm. Bằng cách này, thông dịch viên không lấy dấu chấm làm dấu tách phân số mà là dấu chấm. '42 .format ('0.00')' – Andris

+0

Đúng, nhưng tôi không thích nó :) Xem câu hỏi đính kèm - http://stackoverflow.com/questions/2726590/call-methods-on-native-javascript-types - không có gói-với-để biết thêm chi tiết về điều này. – Anurag

+0

Tôi đã nhận thấy rằng nó không đầy đủ sau khi xem lại. Tôi không hiểu làm thế nào rất nhiều người trên mạng tuyên bố điều này đã làm việc cho họ ... nhưng dù sao, bạn trả lời câu hỏi chính của tôi khá rõ ràng. Cảm ơn! Một điều đáng tiếc là tôi không thể có được chức năng để làm việc. – Choy

Các vấn đề liên quan