Obtuve este código para convertir el tamaño en bytes a través de PHP.
Ahora quiero convertir esos tamaños a tamaños legibles por humanos usando JavaScript. Traté de convertir este código a JavaScript, que se ve así:
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;
}
¿Es esta la forma correcta de hacer esto? hay una manera mas facil?
javascript
byte
converters
l2aelba
fuente
fuente
Respuestas:
De esto: ( fuente )
Nota: Este es el código original. Utilice la versión fija a continuación. Aliceljm ya no activa su código copiado
Ahora, versión fija no minificada, y ES6'ed: (por comunidad)
Ahora, Versión fija: (por la comunidad de Stackoverflow, + Minificado por JSCompress )
Uso:
Demo / fuente:
PD: Cambia
k = 1000
osizes = ["..."]
como quieras ( bits o bytes )fuente
(bytes / Math.pow(1024, i)).toPrecision(3)
toFixed(n)
es probablemente más apropiado quetoPrecision(n)
tener una precisión constante para todos los valores. Y para evitar ceros finales (ej .bytesToSize(1000) // return "1.00 KB"
:) podríamos usarparseFloat(x)
. Sugiero sustituir la última línea por:return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
. Con el cambio anterior, los resultados son:bytesToSize(1000) // return "1 KB"
/bytesToSize(1100) // return "1.1 KB"
/bytesToSize(1110) // return "1.11 KB
/bytesToSize(1111) // also return "1.11 KB"
fuente
Resultados:
fuente
Puede usar la biblioteca filesizejs .
fuente
Hay 2 formas reales de representar tamaños cuando se relacionan con bytes, son unidades SI (10 ^ 3) o unidades IEC (2 ^ 10). También existe JEDEC, pero su método es ambiguo y confuso. Noté que los otros ejemplos tienen errores como el uso de KB en lugar de kB para representar un kilobyte, así que decidí escribir una función que resolverá cada uno de estos casos usando el rango de unidades de medida actualmente aceptadas.
Hay un bit de formato al final que hará que el número se vea un poco mejor (al menos a mi parecer), siéntase libre de eliminar ese formato si no se ajusta a su propósito.
Disfrutar.
fuente
Aquí hay un trazador de líneas:
val => ['Bytes','Kb','Mb','Gb','Tb'][Math.floor(Math.log2(val)/10)]
O incluso:
val => 'BKMGT'[~~(Math.log2(val)/10)]
fuente
val => 'BKMGT'[~~(Math.log10(val)/3)]
i = ~~(Math.log2(b)/10); return (b/Math.pow(1024,i)).toFixed(2) + ("KMGTPEZY"[i-1]||"") + "B"
Usar una operación bit a bit sería una mejor solución. Prueba esto
fuente
De acuerdo con Aliceljm la respuesta de , 0 después del decimal:
fuente
Originalmente utilicé la respuesta de @Aliceljm para un proyecto de carga de archivos en el que estaba trabajando, pero recientemente encontré un problema en el que un archivo estaba
0.98kb
siendo leído como1.02mb
. Aquí está el código actualizado que estoy usando ahora.Lo anterior se llamaría después de agregar un archivo así
Por supuesto, Windows lee el archivo como tal,
24.8mb
pero estoy bien con la precisión adicional.fuente
Esta solución se basa en soluciones anteriores, pero tiene en cuenta las unidades métricas y binarias:
Ejemplos:
fuente
fuente
fuente
Estoy actualizando la respuesta de @Aliceljm aquí. Como el lugar decimal es importante para los números de 1,2 dígitos, redondeo el primer lugar decimal y mantengo el primer lugar decimal. Para el número de 3 dígitos, redondeo el lugar de las unidades e ignoro todos los lugares decimales.
fuente
Así es como se debe mostrar un byte a un humano:
fuente
Solo quería compartir mi opinión. Tuve este problema, así que mi solución es esta. Esto convertirá unidades más bajas en unidades más altas y viceversa, solo proporcione el argumento
toUnit
yfromUnit
Tengo la idea de aqui
fuente
fuente
byteVal >> 10
. También sería mejor usarMath.trunc()
para emitir números reales a enteros en lugar de la división por 1.Prueba esta solución simple.
fuente