Estoy usando esta función para convertir un tamaño de archivo en bytes a un tamaño de archivo legible para 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];
};
Sin embargo, parece que esto no es 100% exacto. Por ejemplo:
getReadableFileSizeString(1551859712); // output is "1.4 GB"
¿No debería ser esto "1.5 GB"
? Parece que la división por 1024 está perdiendo precisión. ¿Estoy entendiendo totalmente algo mal o hay una mejor manera de hacer esto?
javascript
filesize
human-readable
Hristo
fuente
fuente
1.445281982421875
que se redondea correctamente a 1.4.YB
. Dudoso, cualquiera obtendrá incluso 1 YB por su DB. ¡Costará 100 billones de dólares !Respuestas:
Depende de si desea utilizar la convención binaria o decimal.
La RAM, por ejemplo, siempre se mide en binario, por lo que expresar 1551859712 como ~ 1.4GiB sería correcto.
Por otro lado, a los fabricantes de discos duros les gusta usar decimal, por lo que lo llamarían ~ 1.6GB.
Y para ser confuso, los disquetes usan una mezcla de los dos sistemas: su 1 MB es en realidad 1024000 bytes.
fuente
Aquí hay uno que escribí:
fuente
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]}
Otra forma de realización del cálculo.
fuente
var i = size == 0 ? 0 : Math.floor( Math.log(size) / Math.log(1024) );
parece hacer el truco si es 0. Devolverá "0 B".toFixed
y luego haciendo matemáticas con una cadena. ¿Qué hace* 1
?*1
cambia el tipo de datos de cadena a número, por lo que para el valor1024
se obtiene1 kB
en lugar de1.00 kB
. Puede hacer feliz a TypeScript haciendoNumber((size / Math.pow(1024, i)).toFixed(2))
lo mismo.Aquí hay un prototipo para convertir un número en una cadena legible respetando los nuevos estándares internacionales.
https://wiki.ubuntu.com/UnitsPolicy
http://en.wikipedia.org/wiki/Template:Quantities_of_bytes
Esta función no contiene
loop
, por lo que probablemente sea más rápida que otras funciones.Uso:
Prefijo IEC
Prefijo SI
configuré el IEC como predeterminado porque siempre usé el modo binario para calcular el tamaño de un archivo ... usando la potencia de 1024
Si solo quieres uno de ellos en una función de línea corta:
SI
IEC
Uso:
si tiene alguna pregunta sobre las funciones solo pregunte
fuente
.toFixed(e ? 2 : 0)
fuente
\u200b
:'\u200bKMGTP'
.Solución como componente ReactJS
ACTUALIZACIÓN Para aquellos que usan es6 aquí hay una versión sin estado de este mismo componente
fuente
${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]}
;Basado en la idea de Cocco , aquí hay un ejemplo menos compacto, pero con suerte más completo.
fuente
Quería el comportamiento del "administrador de archivos" (por ejemplo, el Explorador de Windows) donde el número de lugares decimales es proporcional al tamaño del número. Al parecer, ninguna de las otras respuestas hace esto.
Aquí hay algunos ejemplos:
fuente
+num.tofixed(2)
.toPrecision(3)
No cubre todos estos casos? Oh ... supongo que no cubre entre 1000 y 1023. Bummer.Otro ejemplo similar a los de aquí.
Mide un rendimiento significativamente mejor que los otros con características similares.
fuente
Aquí está el mío: también funciona para archivos realmente grandes -_-
fuente
Basado en la respuesta de Cocco pero ligeramente desugerificada (honestamente, las que me sentí cómodas se mantienen / agregan) y no muestran ceros finales, pero aún admiten 0, espero sean útiles para otros:
fuente
Tu solución es la correcta. Lo importante a tener en cuenta es que para pasar de
1551859712
a1.5
, debe hacer divisiones por 1000, pero los bytes se cuentan en fragmentos binarios a decimales de 1024, de ahí que el valor de Gigabyte sea menor.fuente
Encontré la respuesta de @cocco interesante, pero tuve los siguientes problemas:
Mecanografiado:
fuente
Esta es la mejora de tamaño de la respuesta mpen
Mostrar fragmento de código
fuente
Para aquellos que usan
Angular
, hay un paquete llamadoangular-pipes
que tiene una tubería para esto:Expediente
Uso
Enlace a los documentos .
fuente
Mi respuesta puede llegar tarde, pero supongo que ayudará a alguien.
Prefijo métrico:
Prefijo binario:
Ejemplos:
fuente
dejar bytes = 1024 * 10 * 10 * 10;
console.log (getReadableFileSizeString (bytes))
devolverá 1000.0Кб en lugar de 1MB
fuente