J'ai obtenu ce code pour convertir la taille en octets via PHP.
Maintenant, je veux convertir ces tailles en tailles lisibles par l'homme à l' aide de JavaScript. J'ai essayé de convertir ce code en JavaScript, qui ressemble à ceci:
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;
}
Est-ce la bonne façon de procéder? Existe-t-il un moyen plus simple?
javascript
byte
converters
l2aelba
la source
la source
Réponses:
De cela: ( source )
Remarque: il s'agit du code d'origine, veuillez utiliser la version fixe ci-dessous. Aliceljm n'active plus son code copié
Maintenant, version fixe non minimisée et ES6: (par communauté)
Maintenant, version fixe: (par la communauté de Stackoverflow, + Minified par JSCompress )
Utilisation:
Démo / source:
PS: changez
k = 1000
ousizes = ["..."]
comme vous voulez ( bits ou octets )la source
(bytes / Math.pow(1024, i)).toPrecision(3)
toFixed(n)
est probablement plus approprié quetoPrecision(n)
d'avoir une précision constante pour toutes les valeurs. Et pour éviter les zéros à la fin (ex:),bytesToSize(1000) // return "1.00 KB"
nous pourrions utiliserparseFloat(x)
. Je suggère de remplacer la dernière ligne par:return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
. Avec le changement précédent, les résultats sont:bytesToSize(1000) // return "1 KB"
/bytesToSize(1100) // return "1.1 KB"
/bytesToSize(1110) // return "1.11 KB
/bytesToSize(1111) // also return "1.11 KB"
la source
Résultats:
la source
Vous pouvez utiliser la bibliothèque filesizejs .
la source
Il existe 2 façons réelles de représenter les tailles par rapport aux octets, ce sont les unités SI (10 ^ 3) ou les unités CEI (2 ^ 10). Il y a aussi JEDEC mais leur méthode est ambiguë et déroutante. J'ai remarqué que les autres exemples comportaient des erreurs telles que l'utilisation de KB au lieu de kB pour représenter un kilo-octet, j'ai donc décidé d'écrire une fonction qui résoudra chacun de ces cas en utilisant la plage d'unités de mesure actuellement acceptées.
Il y a un bit de formatage à la fin qui rendra le nombre un peu meilleur (au moins à mes yeux), n'hésitez pas à supprimer ce formatage s'il ne convient pas à votre objectif.
Prendre plaisir.
la source
Voici une doublure:
val => ['Bytes','Kb','Mb','Gb','Tb'][Math.floor(Math.log2(val)/10)]
Ou même:
val => 'BKMGT'[~~(Math.log2(val)/10)]
la source
val => 'BKMGT'[~~(Math.log10(val)/3)]
i = ~~(Math.log2(b)/10); return (b/Math.pow(1024,i)).toFixed(2) + ("KMGTPEZY"[i-1]||"") + "B"
L'utilisation d'une opération au niveau du bit serait une meilleure solution. Essaye ça
la source
Selon la réponse d' Aliceljm , j'ai supprimé 0 après la virgule:
la source
J'ai utilisé à l' origine la réponse de @Aliceljm pour un projet de téléchargement de fichiers sur lequel je travaillais, mais j'ai récemment rencontré un problème où un fichier était en
0.98kb
cours de lecture1.02mb
. Voici le code mis à jour que j'utilise maintenant.Ce qui précède serait alors appelé après qu'un fichier a été ajouté comme ceci
Certes, Windows lit le fichier comme étant,
24.8mb
mais je suis d' accord avec la précision supplémentaire.la source
Cette solution s'appuie sur les solutions précédentes, mais prend en compte à la fois les unités métriques et binaires:
Exemples:
la source
la source
la source
Je mets à jour la réponse @Aliceljm ici. Étant donné que la décimale compte pour les nombres à 1,2 chiffre, je arrondis la première décimale et conserve la première décimale. Pour un nombre à 3 chiffres, j'arrondis la place des unités et j'ignore toutes les décimales.
la source
Voici comment un octet doit être montré à un humain:
la source
Je voulais juste partager mon avis. J'ai eu ce problème alors ma solution est la suivante. Cela convertira les unités inférieures en unités supérieures et vice versa fournira simplement l'argument
toUnit
etfromUnit
J'ai l'idée d' ici
la source
la source
byteVal >> 10
. Aussi, vous feriez mieux d'utiliserMath.trunc()
pour convertir des nombres réels en entiers au lieu de diviser par 1.Essayez cette solution de contournement simple.
la source