Estou usando esta função para converter um tamanho de arquivo em bytes para um tamanho de arquivo legível por humanos:
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];
};
No entanto, parece que isso não é 100% exato. Por exemplo:
getReadableFileSizeString(1551859712); // output is "1.4 GB"
Isso não deveria ser "1.5 GB"
? Parece que a divisão em 1024 está perdendo precisão. Estou totalmente entendendo mal alguma coisa ou existe uma maneira melhor de fazer isso?
javascript
filesize
human-readable
Hristo
fonte
fonte
1.445281982421875
que arredonda corretamente para 1,4.YB
. Duvidoso, alguém receberá 1 YB por seu DB. Vai custar 100 trilhões de dólares !Respostas:
Depende se você deseja usar a convenção binária ou decimal.
A RAM, por exemplo, é sempre medida em binário, de modo que expressar 1551859712 como ~ 1,4GiB estaria correto.
Por outro lado, os fabricantes de disco rígido gostam de usar decimal, então chamariam ~ 1.6GB.
E, para ser confuso, os disquetes usam uma mistura dos dois sistemas - seus 1 MB são na verdade 1024000 bytes.
fonte
Aqui está um que eu escrevi:
fonte
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]}
Outra modalidade do cálculo
fonte
var i = size == 0 ? 0 : Math.floor( Math.log(size) / Math.log(1024) );
parece fazer o truque se for 0. Ele retornará "0 B".toFixed
e depois fazendo matemática com uma string. O que* 1
faz?*1
altera o tipo de dados de string para número, portanto, para o valor1024
que você começa1 kB
, em vez de1.00 kB
. Você pode fazer feliz o TypeScript fazendoNumber((size / Math.pow(1024, i)).toFixed(2))
o mesmo.Aqui está um protótipo para converter um número em uma sequência legível, respeitando os novos padrões internacionais.
https://wiki.ubuntu.com/UnitsPolicy
http://en.wikipedia.org/wiki/Template:Quantities_of_bytes
Essa função não contém
loop
e, portanto, é provavelmente mais rápida do que algumas outras funções.Uso:
Prefixo IEC
Prefixo SI
Defino o IEC como padrão, porque sempre usei o modo binário para calcular o tamanho de um arquivo ... usando o poder de 1024
Se você quer apenas um deles em uma função curta oneliner:
SI
IEC
Uso:
Se você tiver alguma dúvida sobre as funções, basta perguntar
fonte
.toFixed(e ? 2 : 0)
fonte
\u200b
:'\u200bKMGTP'
.Solução como componente ReactJS
ATUALIZAÇÃO Para aqueles que usam es6, aqui está uma versão sem estado desse mesmo componente
fonte
${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]}
;Com base na idéia de cocco , aqui está um exemplo menos compacto, mas espero mais abrangente.
fonte
Eu queria o comportamento "gerenciador de arquivos" (por exemplo, Windows Explorer) em que o número de casas decimais é proporcional ao tamanho do número. Aparentemente, nenhuma das outras respostas faz isso.
Aqui estão alguns exemplos:
fonte
+num.tofixed(2)
.toPrecision(3)
cobre todos esses casos? Ah ... acho que não cobre entre 1000 e 1023. Que chatice.Outro exemplo semelhante aos aqui
Ele mede um desempenho insignificante melhor que os outros com recursos semelhantes.
fonte
Aqui está o meu - também funciona para arquivos muito grandes -_-
fonte
Com base na resposta de cocco, mas um pouco desugerificada (honestamente, aquelas com as quais eu me senti confortável são mantidas / adicionadas) e não mostra zeros à direita, mas ainda suporta 0, espero ser útil para outras pessoas:
fonte
Sua solução está correta. O importante a ser percebido é que, para passar de
1551859712
para1.5
, é necessário fazer divisões em 1000, mas os bytes são contados em blocos binário-decimais de 1024, daí o valor do Gigabyte ser menor.fonte
Achei a resposta do @cocco interessante, mas tive os seguintes problemas:
TypeScript:
fonte
Esta é a melhoria de tamanho da resposta mpen
Mostrar snippet de código
fonte
Para quem usa
Angular
, existe um pacote chamadoangular-pipes
que possui um canal para isso:Arquivo
Uso
Link para os documentos .
fonte
Minha resposta pode estar atrasada, mas acho que ajudará alguém.
Prefixo métrico:
Prefixo binário:
Exemplos:
fonte
deixe bytes = 1024 * 10 * 10 * 10;
console.log (getReadableFileSizeString (bytes))
retornará 1000,0Кб em vez de 1MB
fonte