2013-07-13 33 views
9

Tôi muốn hiển thị số sử dụng một Metric Prefix với 3 chữ số có nghĩa như sau:Định dạng một số javascript với một tiền tố Metric như 1.5K, 1M, 1G, vv

1 shows as 1 
999 shows as 999 
1000 shows as 1K 
999000 shows as 999K 
1000000 shows as 1M 
1500000 shows as 1.5M 
1000000000 shows as 1G 
etc... 

tôi có thể viết riêng của tôi chức năng javascript để làm điều này nhưng tôi đã tự hỏi nếu có một cách tiêu chuẩn định dạng số như thế này?

+0

@Juhana cảm ơn, đó chính xác là những gì tôi đang tìm kiếm, không chắc tại sao tôi không thấy nó - đã bỏ phiếu để đóng câu hỏi của tôi. – magritte

Trả lời

21

Bạn có thể đặt các dãy trong một mảng của các đối tượng, và chỉ cần lặp qua nó để định dạng số:

var ranges = [ 
    { divider: 1e18 , suffix: 'P' }, 
    { divider: 1e15 , suffix: 'E' }, 
    { divider: 1e12 , suffix: 'T' }, 
    { divider: 1e9 , suffix: 'G' }, 
    { divider: 1e6 , suffix: 'M' }, 
    { divider: 1e3 , suffix: 'k' } 
]; 

function formatNumber(n) { 
    for (var i = 0; i < ranges.length; i++) { 
    if (n >= ranges[i].divider) { 
     return (n/ranges[i].divider).toString() + ranges[i].suffix; 
    } 
    } 
    return n.toString(); 
} 

Cách sử dụng Ví dụ:

var s = formatNumber(999000); 

cũng Xử lý số âm, bạn sẽ thêm nội dung này đầu tiên vào hàm:

if (n < 0) { 
    return '-' + formatNumber(-n); 
    } 
+0

Đó là một ý tưởng gọn gàng, cảm ơn - tôi cần phải tinh chỉnh nó một chút mặc dù để có được tối đa 3 con số đáng kể để hiển thị. Tôi đã thay đổi hàm toString() của bạn thành một cuộc gọi toFixed() gần như thực hiện, nhưng 999999 hiển thị là 1000k thay vì 1M. – magritte

+0

@magritte: Vâng, đúng hơn là, vì 999999 không phải là khá 1000000, vì vậy nó là 999.999 k. – Guffa

+1

Một tùy chọn khác cho số âm là 'if (Math.abs (n)> = range [i] .divider)'. –