Eu tenho esse código para o tamanho secreto em bytes via PHP.
Agora, quero converter esses tamanhos para tamanhos legíveis por humanos usando JavaScript. Eu tentei converter esse código em JavaScript, que se parece com isso:
function formatSizeUnits(bytes){
if (bytes >= 1073741824) { bytes = (bytes / 1073741824).toFixed(2) + " GB"; }
else if (bytes >= 1048576) { bytes = (bytes / 1048576).toFixed(2) + " MB"; }
else if (bytes >= 1024) { bytes = (bytes / 1024).toFixed(2) + " KB"; }
else if (bytes > 1) { bytes = bytes + " bytes"; }
else if (bytes == 1) { bytes = bytes + " byte"; }
else { bytes = "0 bytes"; }
return bytes;
}
Essa é a maneira correta de fazer isso? Existe uma maneira mais fácil?
javascript
byte
converters
l2aelba
fonte
fonte
Respostas:
Disto: ( fonte )
Nota: Este é o código original. Por favor, use a versão fixa abaixo. Aliceljm não ativa mais seu código copiado
Agora, versão fixa não minificada e ES6'ed: (por comunidade)
Agora, versão fixa: (pela comunidade Stackoverflow, + Minified by JSCompress )
Uso:
Demo / fonte:
PS: Altere
k = 1000
ousizes = ["..."]
conforme desejar ( bits ou bytes )fonte
(bytes / Math.pow(1024, i)).toPrecision(3)
toFixed(n)
provavelmente é mais apropriado dotoPrecision(n)
que ter uma precisão consistente para todos os valores. E para evitar zeros à direita (ex:)bytesToSize(1000) // return "1.00 KB"
, poderíamos usarparseFloat(x)
. Sugiro para substituir a última linha por:return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
. Com a alteração anterior, os resultados são:bytesToSize(1000) // return "1 KB"
/bytesToSize(1100) // return "1.1 KB"
/bytesToSize(1110) // return "1.11 KB
/bytesToSize(1111) // also return "1.11 KB"
fonte
Resultados:
fonte
Você pode usar a biblioteca filesizejs .
fonte
Existem 2 maneiras reais de representar tamanhos quando relacionadas a bytes: elas são unidades SI (10 ^ 3) ou unidades IEC (2 ^ 10). Há também o JEDEC, mas o método deles é ambíguo e confuso. Percebi que os outros exemplos têm erros, como usar KB em vez de kB para representar um kilobyte, então decidi escrever uma função que resolverá cada um desses casos usando o intervalo de unidades de medida atualmente aceitas.
Há um bit de formatação no final que fará com que o número pareça um pouco melhor (pelo menos para os meus olhos) fique à vontade para remover essa formatação se ela não se adequar ao seu objetivo.
Aproveitar.
fonte
Aqui está uma lista:
val => ['Bytes','Kb','Mb','Gb','Tb'][Math.floor(Math.log2(val)/10)]
Ou até:
val => 'BKMGT'[~~(Math.log2(val)/10)]
fonte
val => 'BKMGT'[~~(Math.log10(val)/3)]
i = ~~(Math.log2(b)/10); return (b/Math.pow(1024,i)).toFixed(2) + ("KMGTPEZY"[i-1]||"") + "B"
Usar a operação bit a bit seria uma solução melhor. Tente isto
fonte
De acordo com a resposta de Aliceljm , removi 0 após o decimal:
fonte
Originalmente, usei a resposta de @Aliceljm para um projeto de upload de arquivo no qual estava trabalhando, mas recentemente tive um problema em que um arquivo estava
0.98kb
sendo lido como1.02mb
. Aqui está o código atualizado que estou usando agora.O exemplo acima seria chamado depois que um arquivo fosse adicionado dessa forma
Concedido, o Windows lê o arquivo como sendo,
24.8mb
mas eu estou bem com a precisão extra.fonte
Esta solução baseia-se em soluções anteriores, mas leva em consideração as unidades métricas e binárias:
Exemplos:
fonte
fonte
fonte
Estou atualizando a resposta @Aliceljm aqui. Como a casa decimal é importante para números de 1,2 dígitos, arredondo a primeira casa decimal e mantenho a primeira casa decimal. Para um número de 3 dígitos, arredondar a casa das unidades e ignorar todas as casas decimais.
fonte
É assim que um byte deve ser mostrado para um humano:
fonte
Eu só queria compartilhar minha opinião. Eu tive esse problema, então minha solução é essa. Isso converterá unidades inferiores em unidades superiores e vice-versa apenas fornecerá o argumento
toUnit
efromUnit
Eu peguei a ideia daqui
fonte
fonte
byteVal >> 10
. Também seria melhor usarMath.trunc()
para lançar os números reais em inteiros em vez ofdivision por 1.Experimente esta solução simples.
fonte