Я использую эту функцию для преобразования размера файла в байтах в читаемый человеком размер файла:
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];
};
Однако, похоже, что это не на 100% точно. Например:
getReadableFileSizeString(1551859712); // output is "1.4 GB"
Не должно ли это быть "1.5 GB"
? Кажется, что деление на 1024 теряет точность. Я что-то совершенно не понимаю или есть лучший способ сделать это?
javascript
filesize
human-readable
Христо
источник
источник
1.445281982421875
что правильно округляется до 1,4.YB
. Сомнительно, что кто-нибудь получит хотя бы 1 YB за свою БД. Это будет стоить 100 триллионов долларов !Ответы:
Это зависит от того, хотите ли вы использовать двоичное или десятичное соглашение.
ОЗУ, например, всегда измеряется в двоичном формате, поэтому было бы правильно выразить 1551859712 как ~ 1,4 ГБ.
С другой стороны, производители жестких дисков предпочитают использовать десятичную дробь, поэтому они назвали бы ее ~ 1,6 ГБ.
И просто чтобы запутать, дискеты используют смесь двух систем - их 1 МБ на самом деле 1024000 байт.
источник
Вот тот, который я написал:
источник
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]}
Еще одно воплощение расчета
источник
var i = size == 0 ? 0 : Math.floor( Math.log(size) / Math.log(1024) );
кажется, делает уловку, если это 0. Это возвратит "0 B".toFixed
а затем делаете математику со строкой. Что делает* 1
?*1
Изменяет тип данных из строки на номер, так что для значения1024
вы получите1 kB
вместо1.00 kB
. Вы можете сделать TypeScript счастливым,Number((size / Math.pow(1024, i)).toFixed(2))
выполнив то же самое.Вот прототип для преобразования числа в читаемую строку с учетом новых международных стандартов.
https://wiki.ubuntu.com/UnitsPolicy
http://en.wikipedia.org/wiki/Template:Quantities_of_bytes
Эта функция не содержит no
loop
, и поэтому она, вероятно, быстрее, чем некоторые другие функции.Использование:
Префикс IEC
Префикс СИ
я установил IEC по умолчанию, потому что я всегда использовал двоичный режим для расчета размера файла ... используя мощность 1024
Если вам просто нужен один из них в короткой функции oneliner:
SI
IEC
Использование:
если у вас есть вопросы о функциях, просто спросите
источник
.toFixed(e ? 2 : 0)
источник
\u200b
:'\u200bKMGTP'
.Решение как компонент ReactJS
ОБНОВЛЕНИЕ Для тех, кто использует es6, вот версия без сохранения состояния этого же компонента
источник
${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]}
;Основываясь на идее Cocco , вот менее компактный, но, надеюсь, более всеобъемлющий пример.
источник
Я хотел поведение «файловый менеджер» (например, Windows Explorer), где количество десятичных разрядов пропорционально размеру числа. По-видимому, ни один из других ответов не делает этого.
Вот несколько примеров:
источник
+num.tofixed(2)
.toPrecision(3)
распространяется на все эти случаи? Ох .. Я думаю, это не распространяется между 1000 и 1023. Облом.Еще один пример похож на те, что здесь
Он измеряет значительно лучшую производительность, чем другие с аналогичными функциями.
источник
Вот мой - работает и для действительно больших файлов -_-
источник
Основанный на ответе кокко, но немного десегерифицированный (честно говоря, те, с которыми мне было удобно, остались / добавлены) и не показывает завершающие нули, но все еще поддерживает 0, надеюсь, будет полезен для других:
источник
Ваше решение правильное. Важно понимать, что для того, чтобы перейти от
1551859712
к1.5
, вам нужно делить на 1000, но байты считаются в двоично-десятичных блоках 1024, поэтому значение гигабайта меньше.источник
Я нашел интересный ответ @ cocco , но у меня были следующие проблемы:
Машинопись:
источник
Это улучшение размера ответа mpen
Показать фрагмент кода
источник
Для тех, кто использует
Angular
, есть пакет,angular-pipes
который имеет канал для этого:файл
использование
Ссылка на документы .
источник
Мой ответ может быть поздно, но я думаю, что это поможет кому-то.
Метрический префикс:
Двоичный префикс:
Примеры:
источник
пусть байты = 1024 * 10 * 10 * 10;
console.log (getReadableFileSizeString (байт))
вернет 1000.0Кб вместо 1МБ
источник