Chuyển đổi kích thước tệp theo byte thành chuỗi có thể đọc được


239

Tôi đang sử dụng chức năng này để chuyển đổi kích thước tệp theo byte thành kích thước tệp có thể đọc được của con người:

function getReadableFileSizeString(fileSizeInBytes) {
    var i = -1;
    var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
    do {
        fileSizeInBytes = fileSizeInBytes / 1024;
        i++;
    } while (fileSizeInBytes > 1024);

    return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
};

Tuy nhiên, có vẻ như điều này không chính xác 100%. Ví dụ:

getReadableFileSizeString(1551859712); // output is "1.4 GB"

Điều này có nên không "1.5 GB"? Có vẻ như phép chia cho 1024 đang mất độ chính xác. Tôi hoàn toàn hiểu sai điều gì đó hay có cách nào tốt hơn để làm điều này?


3
getReadableFileSizeString (0); trả về 0,1kb; p
Daniel Magnusson

2
Tại sao phải là 1,5? Đó là 1.445281982421875làm tròn chính xác xuống 1,4.
mở

1
1551859712 / (1024 ^ 3) = 1.445281982421875 là chính xác!
HM

2
Tôi thích rằng bạn đã thêm YB. Chắc chắn bất cứ ai cũng sẽ nhận được thậm chí 1 YB cho DB của mình. Nó sẽ có giá 100 nghìn tỷ đô la !
Guyarad

4
@guyarad - có một hình ảnh nổi tiếng về ổ cứng 5 MB từ 50 năm trước (có kích thước của một căn phòng và nặng khoảng một tấn). Tôi chắc chắn hồi đó họ thậm chí không mơ về GB và TB, và nhìn vào nơi chúng ta đang ở hôm nay ... không bao giờ nói không bao giờ ;-)
TheCuBeMan

Câu trả lời:


45

Nó phụ thuộc vào việc bạn muốn sử dụng quy ước nhị phân hay thập phân.

RAM, ví dụ, luôn được đo bằng nhị phân, do đó, để thể hiện 1551859712 là ~ 1.4GiB là chính xác.

Mặt khác, các nhà sản xuất đĩa cứng muốn sử dụng số thập phân, vì vậy họ sẽ gọi nó là ~ 1.6GB.

Và để gây nhầm lẫn, các đĩa mềm sử dụng hỗn hợp của hai hệ thống - 1 MB của chúng thực sự là 1024000 byte.


3
supper funny ;-) "chỉ để gây nhầm lẫn, các đĩa mềm sử dụng hỗn hợp của hai hệ thống - 1 MB của chúng thực sự là 1024000 byte."
FranXho

đúng, kích thước RAM được đo bằng các đơn vị IEC, kích thước đĩa bằng số liệu .. có mô-đun npm đẳng hình để chuyển đổi cả hai: kích thước byte
Lloyd

351

Đây là một trong những tôi đã viết:

function humanFileSize(bytes, si=false, dp=1) {
  const thresh = si ? 1000 : 1024;

  if (Math.abs(bytes) < thresh) {
    return bytes + ' B';
  }

  const units = si 
    ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] 
    : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
  let u = -1;
  const r = 10**dp;

  do {
    bytes /= thresh;
    ++u;
  } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);


  return bytes.toFixed(dp) + ' ' + units[u];
}


console.log(humanFileSize(5000, true))  // 5.0 kB
console.log(humanFileSize(5000, false))  // 4.9 KiB
console.log(humanFileSize(-10000000000000000000000000000))  // -8271.8 YiB
console.log(humanFileSize(999949, true))  // 999.9 kB
console.log(humanFileSize(999950, true))  // 1.0 MB
console.log(humanFileSize(999950, true, 2))  // 999.95 kB
console.log(humanFileSize(999500, true, 0))  // 1 MB


1
Tôi đang thực hiện một điều chỉnh: Khi đánh giá ngưỡng, hãy lấy giá trị tuyệt đối. Bằng cách này, hàm sẽ hỗ trợ các giá trị âm. Chức năng tốt đẹp! Cảm ơn bạn đã không sử dụng một tuyên bố chuyển đổi !!
Aaron Blenkush

20
@AaronBlenkush: Khi nào bạn sẽ có kích thước tệp âm?
mở

14
Tôi vừa sao chép chức năng của bạn vào Google Sheet tôi đang sử dụng để hiển thị kích thước delta sau thao tác "dọn dẹp". Trước, Sau và Khác. Hoạt động dọn dẹp dẫn đến sự tăng trưởng của một số bảng cơ sở dữ liệu và giảm các bảng khác. Ví dụ, Bảng A có độ chênh lệch -1,95 MB, trong khi Bảng B có độ chênh lệch 500 kB. Do đó: tích cực và tiêu cực :-)
Aaron Blenkush

Đây là phiên bản nén của tập lệnh:function humanFileSize(B,i){var e=i?1e3:1024;if(Math.abs(B)<e)return B+" B";var a=i?["kB","MB","GB","TB","PB","EB","ZB","YB"]:["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],t=-1;do B/=e,++t;while(Math.abs(B)>=e&&t<a.length-1);return B.toFixed(1)+" "+a[t]}
RAnders00

1
@ RAnders00: Cảm ơn phiên bản rút gọn. Tuy nhiên, bạn có thể cho tôi biết lý do tại sao bạn chèn hai ký tự Unicode vô hình U + 200C (ZERO WIDTH NON- THAM GIA ) và U + 200B (ZERO WIDTH SPACE) sau E oft EiB không? Đây có phải là một hình mờ, để bạn có thể theo dõi ai đã sử dụng mã này? Nếu vậy, tôi nghĩ bạn nên làm cho minh bạch trong bài viết của bạn.
Leviathan

81

Một phương án khác của tính toán

function humanFileSize(size) {
    var i = Math.floor( Math.log(size) / Math.log(1024) );
    return ( size / Math.pow(1024, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
};

8
dường như không xử lý 0
Offirmo

4
Nó không hoặc không xử lý 0? Xét cho cùng, điều này với if (size == 0) {} khác {} vẫn thanh lịch hơn hầu hết tôi đã thấy.
Rodrigo

13
Thay đổi dòng đầu tiên var i = size == 0 ? 0 : Math.floor( Math.log(size) / Math.log(1024) );để thực hiện thủ thuật nếu nó bằng 0. Nó sẽ trả về "0 B".
Gavin

Chỉ cần FYI; Tôi biết câu trả lời là JavaScript đơn giản, nhưng nếu ai đó không sử dụng nó trong TypeScript, thì nó không hoạt động (không được gõ chính xác, như bạn đang làm toFixedvà sau đó làm toán với một chuỗi. Làm gì * 1?
Frexuz

1
Các *1thay đổi kiểu dữ liệu từ chuỗi số, vì vậy cho giá trị 1024bạn nhận được 1 kBthay vì 1.00 kB. Bạn có thể làm cho TypeScript hài lòng bằng cách thực hiện Number((size / Math.pow(1024, i)).toFixed(2))để hoàn thành điều tương tự.
Adrian T

38

Dưới đây là một nguyên mẫu để chuyển đổi một số thành một chuỗi có thể đọc được theo các tiêu chuẩn quốc tế mới.

Có hai cách để biểu thị số lớn: Bạn có thể hiển thị chúng theo bội số 1000 = 10 3 (cơ sở 10) hoặc 1024 = 2 10 (cơ sở 2). Nếu bạn chia cho 1000, bạn có thể sử dụng tên tiền tố SI, nếu bạn chia cho 1024, bạn có thể sử dụng tên tiền tố IEC. Vấn đề bắt đầu bằng cách chia cho 1024. Nhiều ứng dụng sử dụng tên tiền tố SI cho nó và một số sử dụng tên tiền tố IEC. Tình hình hiện tại là một mớ hỗn độn. Nếu bạn thấy tên tiền tố SI, bạn không biết số đó được chia cho 1000 hay 1024

https://wiki.ubfox.com/UnitsPolicy

http://en.wikipedia.org/wiki/Template:Quantities_of_bytes

Object.defineProperty(Number.prototype,'fileSize',{value:function(a,b,c,d){
 return (a=a?[1e3,'k','B']:[1024,'K','iB'],b=Math,c=b.log,
 d=c(this)/c(a[0])|0,this/b.pow(a[0],d)).toFixed(2)
 +' '+(d?(a[1]+'MGTPEZY')[--d]+a[2]:'Bytes');
},writable:false,enumerable:false});

Hàm này không chứa loop, và vì vậy nó có thể nhanh hơn một số hàm khác.

Sử dụng:

Tiền tố truyền thông

console.log((186457865).fileSize()); // default IEC (power 1024)
//177.82 MiB
//KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB

Tiền tố SI

console.log((186457865).fileSize(1)); //1,true for SI (power 1000)
//186.46 MB 
//kB,MB,GB,TB,PB,EB,ZB,YB

tôi đặt IEC làm mặc định vì tôi luôn sử dụng chế độ nhị phân để tính kích thước của tệp ... sử dụng sức mạnh của 1024


Nếu bạn chỉ muốn một trong số chúng trong một chức năng oneliner ngắn:

SI

function fileSizeSI(a,b,c,d,e){
 return (b=Math,c=b.log,d=1e3,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'kMGTPEZY'[--e]+'B':'Bytes')
}
//kB,MB,GB,TB,PB,EB,ZB,YB

Thông tin liên lạc

function fileSizeIEC(a,b,c,d,e){
 return (b=Math,c=b.log,d=1024,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'KMGTPEZY'[--e]+'iB':'Bytes')
}
//KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB

Sử dụng:

console.log(fileSizeIEC(7412834521));

Nếu bạn có một số câu hỏi về các chức năng chỉ cần hỏi


Mã nhỏ gọn rất đẹp, cá nhân tôi muốn thêm một vài ký tự phụ để kiểm soát các vị trí thập phân.
Orwellophile

Chào! Trên thực tế, mã là cách tôi viết nó lần đầu tiên trong jsfiddle. Trong những năm qua, tôi đã học được cách sử dụng tốc ký và bitwise. Thiết bị di động chậm, internet chậm, không có nhiều không gian ... làm như vậy tôi tiết kiệm được nhiều thời gian. Nhưng đó không phải là tất cả, độ hoàn hảo tổng thể tăng lên trong mọi trình duyệt và toàn bộ mã tải nhanh hơn nhiều ... tôi không sử dụng jquery vì vậy tôi không phải tải 100kb mỗi lần. Tôi cũng cần phải nói rằng tôi cũng viết javascript bằng vi điều khiển, Smart TV, máy chơi game. những người có không gian hạn chế (MCU), hiệu suất (SmartTV) và đôi khi kết nối chậm (Di động)
cocco

Nói rằng tôi hy vọng bạn hiểu sự lựa chọn của tôi. Tất cả những gì tôi có thể làm là giải thích những gì bạn không hiểu hoặc ở phía bên kia, tôi luôn vui vẻ học hỏi những điều mới. Nếu có một cái gì đó trong mã của tôi có thể tăng hiệu suất hoặc tiết kiệm không gian, tôi rất vui khi nghe nó.
cocco

18
Giảm thiểu phải là một phần của quá trình xây dựng của bạn, không phải là phong cách mã hóa của bạn. Không có nhà phát triển nghiêm túc nào sẽ sử dụng mã này vì điều đó vì mất quá nhiều thời gian để đọc và xác minh tính chính xác.
huysentbeanw

1
Đối với những người ghét xem "15.00 Byte", bạn chỉ có thể sửa đổi phần này một chút:.toFixed(e ? 2 : 0)
Lukman

20
sizeOf = function (bytes) {
  if (bytes == 0) { return "0.00 B"; }
  var e = Math.floor(Math.log(bytes) / Math.log(1024));
  return (bytes/Math.pow(1024, e)).toFixed(2)+' '+' KMGTP'.charAt(e)+'B';
}

sizeOf (2054110009);
// => "1,91 GB"

sizeOf (7054110);
// => "6,73 MB"

sizeOf ((3 * 1024 * 1024));
// => "3,00 MB"


2
Nếu bạn muốn loại bỏ không gian thừa cho byte, bạn có thể sử dụng không gian có độ rộng bằng không \u200b: '\u200bKMGTP'.
cdmckay

15

Giải pháp như Thành phần ReactJS

Bytes = React.createClass({
    formatBytes() {
        var i = Math.floor(Math.log(this.props.bytes) / Math.log(1024));
        return !this.props.bytes && '0 Bytes' || (this.props.bytes / Math.pow(1024, i)).toFixed(2) + " " + ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'][i]
    },
    render () {
        return (
            <span>{ this.formatBytes() }</span>
        );
    }
});

CẬP NHẬT Đối với những người sử dụng es6 ở đây là phiên bản không trạng thái của cùng thành phần này

const sufixes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const getBytes = (bytes) => {
  const i = Math.floor(Math.log(bytes) / Math.log(1024));
  return !bytes && '0 Bytes' || (bytes / Math.pow(1024, i)).toFixed(2) + " " + sufixes[i];
};

const Bytes = ({ bytes }) => (<span>{ getBytes(bytes) }</span>);

Bytes.propTypes = {
  bytes: React.PropTypes.number,
};

1
Cảm ơn rất nhiều. Bạn chỉ quên "byte" bên trong Math.log () trong dòng đầu tiên của hàm getBytes
BaptWaels

Rất đẹp. Để định hướng và với ký hiệu ES6, bạn có thể sử dụng cách này: return (! Byte && '0 Byte') || ${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]};
Little Brain

12

Dựa trên ý tưởng của cocco , đây là một ví dụ nhỏ gọn hơn - nhưng hy vọng toàn diện hơn - ví dụ.

<!DOCTYPE html>
<html>
<head>
<title>File info</title>

<script>
<!--
function fileSize(bytes) {
    var exp = Math.log(bytes) / Math.log(1024) | 0;
    var result = (bytes / Math.pow(1024, exp)).toFixed(2);

    return result + ' ' + (exp == 0 ? 'bytes': 'KMGTPEZY'[exp - 1] + 'B');
}

function info(input) {
    input.nextElementSibling.textContent = fileSize(input.files[0].size);
} 
-->
</script>
</head>

<body>
<label for="upload-file"> File: </label>
<input id="upload-file" type="file" onchange="info(this)">
<div></div>
</body>
</html> 

8

Tôi muốn hành vi "trình quản lý tệp" (ví dụ: Windows Explorer) trong đó số lượng vị trí thập phân tỷ lệ thuận với kích thước số. Dường như không có câu trả lời nào khác làm điều này.

function humanFileSize(size) {
    if (size < 1024) return size + ' B'
    let i = Math.floor(Math.log(size) / Math.log(1024))
    let num = (size / Math.pow(1024, i))
    let round = Math.round(num)
    num = round < 10 ? num.toFixed(2) : round < 100 ? num.toFixed(1) : round
    return `${num} ${'KMGTPEZY'[i-1]}B`
}

Dưới đây là một số ví dụ:

humanFileSize(0)          // "0 B"
humanFileSize(1023)       // "1023 B"
humanFileSize(1024)       // "1.00 KB"
humanFileSize(10240)      // "10.0 KB"
humanFileSize(102400)     // "100 KB"
humanFileSize(1024000)    // "1000 KB"
humanFileSize(12345678)   // "11.8 MB"
humanFileSize(1234567890) // "1.15 GB"

bằng cách sử dụng toFixed chuyển đổi nó thành một chuỗi, vì vậy vòng của bạn là một chuỗi hoặc một số. Đây là một thực tế tồi tệ, bạn có thể dễ dàng chuyển đổi nó thành một số:+num.tofixed(2)
Vincent Duprez

Không .toPrecision(3)bao gồm tất cả các trường hợp? Ồ .. tôi đoán nó không nằm trong khoảng từ 1000 đến 1023. Bummer.
mở

7

Một ví dụ khác tương tự như ở đây

function fileSize(b) {
    var u = 0, s=1024;
    while (b >= s || -b >= s) {
        b /= s;
        u++;
    }
    return (u ? b.toFixed(1) + ' ' : b) + ' KMGTPEZY'[u] + 'B';
}

Nó đo hiệu suất tốt hơn đáng kể so với những người khác có tính năng tương tự.


Điều này không cung cấp hiệu suất tốt hơn so với một số câu trả lời khác. Tôi đang sử dụng cái này. Một số người khác làm cho các tab Chrome của tôi bị treo và chiếm 99,9% CPU khi tôi đang thực hiện một phép tính định kỳ.
Nir Lanka

5

Đây là của tôi - cũng hoạt động cho các tệp thực sự lớn -_-

function formatFileSize(size)
{
    var sizes = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB'];
    for (var i = 1; i < sizes.length; i++)
    {
        if (size < Math.pow(1024, i)) return (Math.round((size/Math.pow(1024, i-1))*100)/100) + sizes[i-1];
    }
    return size;
}

Nó kết hợp hiệu năng của cả vòng lặp và việc sử dụng lũy ​​thừa, trong khi khá khó đọc. Tôi không thực sự nhìn thấy điểm.
quang phổ

2
Đừng dùng nó sau đó. Nó chỉ là cpu khách hàng được sử dụng nên ai quan tâm;)
fiffy 31/08/2015

2
@fiffy Vâng, CPU khách cũng rất quý, đặc biệt là trên thiết bị di động và với các ứng dụng phức tạp. :)
Raito

5

Dựa trên câu trả lời của cocco nhưng hơi tuyệt vọng (thành thật mà nói, những thứ tôi cảm thấy thoải mái vẫn được duy trì / thêm vào) và không hiển thị các số 0 ở cuối nhưng vẫn hỗ trợ 0, hy vọng sẽ hữu ích cho những người khác:

function fileSizeSI(size) {
    var e = (Math.log(size) / Math.log(1e3)) | 0;
    return +(size / Math.pow(1e3, e)).toFixed(2) + ' ' + ('kMGTPEZY'[e - 1] || '') + 'B';
}


// test:
document.write([0, 23, 4322, 324232132, 22e9, 64.22e12, 76.22e15, 64.66e18, 77.11e21, 22e24].map(fileSizeSI).join('<br>'));


4
1551859712 / 1024 = 1515488
1515488 / 1024 = 1479.96875
1479.96875 / 1024 = 1.44528198242188

Giải pháp của bạn là chính xác. Điều quan trọng cần nhận ra là để có được từ 1551859712đến 1.5, bạn phải chia 1000, nhưng byte được tính theo số nhị phân đến thập phân là 1024, do đó giá trị Gigabyte ít hơn.


@Eli ... vâng, có vẻ như nó. Tôi đoán rằng tôi đã mong đợi "1,5" kể từ 1551859712, nhưng điều đó có nghĩa là tôi ở dạng thập phân không phải là nhị phân.
Hristo

3

Tôi thấy câu trả lời của @ cocco rất thú vị, nhưng có những vấn đề sau với nó:

  1. Không sửa đổi loại bản địa hoặc loại bạn không sở hữu
  2. Viết mã sạch, dễ đọc cho con người, hãy để công cụ khai thác tối ưu hóa mã cho máy
  3. (Phần thưởng cho người dùng TypeScript) Không chơi tốt với TypeScript

TypeScript:

 /**
 * Describes manner by which a quantity of bytes will be formatted.
 */
enum ByteFormat {
  /**
   * Use Base 10 (1 kB = 1000 bytes). Recommended for sizes of files on disk, disk sizes, bandwidth.
   */
  SI = 0,
  /**
   * Use Base 2 (1 KiB = 1024 bytes). Recommended for RAM size, size of files on disk.
   */
  IEC = 1
}

/**
 * Returns a human-readable representation of a quantity of bytes in the most reasonable unit of magnitude.
 * @example
 * formatBytes(0) // returns "0 bytes"
 * formatBytes(1) // returns "1 byte"
 * formatBytes(1024, ByteFormat.IEC) // returns "1 KiB"
 * formatBytes(1024, ByteFormat.SI) // returns "1.02 kB"
 * @param size The size in bytes.
 * @param format Format using SI (Base 10) or IEC (Base 2). Defaults to SI.
 * @returns A string describing the bytes in the most reasonable unit of magnitude.
 */
function formatBytes(
  value: number,
  format: ByteFormat = ByteFormat.SI
) {
  const [multiple, k, suffix] = (format === ByteFormat.SI
    ? [1000, 'k', 'B']
    : [1024, 'K', 'iB']) as [number, string, string]
  // tslint:disable-next-line: no-bitwise
  const exp = (Math.log(value) / Math.log(multiple)) | 0
  // or, if you'd prefer not to use bitwise expressions or disabling tslint rules, remove the line above and use the following:
  // const exp = value === 0 ? 0 : Math.floor(Math.log(value) / Math.log(multiple)) 
  const size = Number((value / Math.pow(multiple, exp)).toFixed(2))
  return (
    size +
    ' ' +
    (exp 
       ? (k + 'MGTPEZY')[exp - 1] + suffix 
       : 'byte' + (size !== 1 ? 's' : ''))
  )
}

// example
[0, 1, 1024, Math.pow(1024, 2), Math.floor(Math.pow(1024, 2) * 2.34), Math.pow(1024, 3), Math.floor(Math.pow(1024, 3) * 892.2)].forEach(size => {
  console.log('Bytes: ' + size)
  console.log('SI size: ' + formatBytes(size))
  console.log('IEC size: ' + formatBytes(size, 1) + '\n')
});

1

Đây là cải thiện kích thước của câu trả lời mpen

function humanFileSize(bytes, si=false) {
  let u, b=bytes, t= si ? 1000 : 1024;     
  ['', si?'k':'K', ...'MGTPEZY'].find(x=> (u=x, b/=t, b**2<1));
  return `${u ? (t*b).toFixed(1) : bytes} ${u}${!si && u ? 'i':''}B`;    
}


0

Đối với những người sử dụng Angular, có một gói được gọi là angular-pipescó một đường ống cho việc này:

Tập tin

import { BytesPipe } from 'angular-pipes';

Sử dụng

{{ 150 | bytes }} <!-- 150 B -->
{{ 1024 | bytes }} <!-- 1 KB -->
{{ 1048576 | bytes }} <!-- 1 MB -->
{{ 1024 | bytes: 0 : 'KB' }} <!-- 1 MB -->
{{ 1073741824 | bytes }} <!-- 1 GB -->
{{ 1099511627776 | bytes }} <!-- 1 TB -->
{{ 1073741824 | bytes : 0 : 'B' : 'MB' }} <!-- 1024 MB -->

Liên kết đến các tài liệu .


0

Câu trả lời của tôi có thể bị trễ, nhưng tôi đoán nó sẽ giúp được ai đó.

Tiền tố số liệu:

/**
 * Format file size in metric prefix
 * @param fileSize
 * @returns {string}
 */
const formatFileSizeMetric = (fileSize) => {
  let size = Math.abs(fileSize);

  if (Number.isNaN(size)) {
    return 'Invalid file size';
  }

  if (size === 0) {
    return '0 bytes';
  }

  const units = ['bytes', 'kB', 'MB', 'GB', 'TB'];
  let quotient = Math.floor(Math.log10(size) / 3);
  quotient = quotient < units.length ? quotient : units.length - 1;
  size /= (1000 ** quotient);

  return `${+size.toFixed(2)} ${units[quotient]}`;
};

Tiền tố nhị phân:

/**
 * Format file size in binary prefix
 * @param fileSize
 * @returns {string}
 */
const formatFileSizeBinary = (fileSize) => {
  let size = Math.abs(fileSize);

  if (Number.isNaN(size)) {
    return 'Invalid file size';
  }

  if (size === 0) {
    return '0 bytes';
  }

  const units = ['bytes', 'kiB', 'MiB', 'GiB', 'TiB'];
  let quotient = Math.floor(Math.log2(size) / 10);
  quotient = quotient < units.length ? quotient : units.length - 1;
  size /= (1024 ** quotient);

  return `${+size.toFixed(2)} ${units[quotient]}`;
};

Ví dụ:

// Metrics prefix
formatFileSizeMetric(0)      // 0 bytes
formatFileSizeMetric(-1)     // 1 bytes
formatFileSizeMetric(100)    // 100 bytes
formatFileSizeMetric(1000)   // 1 kB
formatFileSizeMetric(10**5)  // 10 kB
formatFileSizeMetric(10**6)  // 1 MB
formatFileSizeMetric(10**9)  // 1GB
formatFileSizeMetric(10**12) // 1 TB
formatFileSizeMetric(10**15) // 1000 TB

// Binary prefix
formatFileSizeBinary(0)     // 0 bytes
formatFileSizeBinary(-1)    // 1 bytes
formatFileSizeBinary(1024)  // 1 kiB
formatFileSizeBinary(2048)  // 2 kiB
formatFileSizeBinary(2**20) // 1 MiB
formatFileSizeBinary(2**30) // 1 GiB
formatFileSizeBinary(2**40) // 1 TiB
formatFileSizeBinary(2**50) // 1024 TiB

-1

để byte = 1024 * 10 * 10 * 10;

console.log (getReadableFileSizeString (byte))

sẽ trả lại 1000.0KOv thay vì 1MB

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.