J'utilise cette fonction pour convertir une taille de fichier en octets en une taille de fichier lisible par l'homme:
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];
};
Cependant, il semble que ce ne soit pas précis à 100%. Par exemple:
getReadableFileSizeString(1551859712); // output is "1.4 GB"
Cela ne devrait-il pas être "1.5 GB"
? Il semble que la division par 1024 perd de sa précision. Suis-je totalement incompris quelque chose ou existe-t-il une meilleure façon de le faire?
1.445281982421875
qui arrondit correctement à 1,4.YB
. Personne douteux ne recevra même 1 YB pour sa DB. Cela coûtera 100 billions de dollars !Réponses:
Cela dépend si vous souhaitez utiliser la convention binaire ou décimale.
La RAM, par exemple, est toujours mesurée en binaire, donc exprimer 1551859712 comme ~ 1,4 Go serait correct.
D'autre part, les fabricants de disques durs aiment utiliser la décimale, ils l'appelleraient donc ~ 1,6 Go.
Et juste pour être déroutant, les disquettes utilisent un mélange des deux systèmes - leur 1 Mo est en fait de 1024 000 octets.
la source
En voici un que j'ai écrit:
la source
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]}
Un autre mode de réalisation du calcul
la source
var i = size == 0 ? 0 : Math.floor( Math.log(size) / Math.log(1024) );
semble faire l'affaire si c'est 0. Elle renverra "0 B".toFixed
, puis faites des mathématiques avec une chaîne. Que fait-* 1
il?*1
change le type de données de chaîne en nombre, donc pour la valeur que1024
vous obtenez1 kB
au lieu de1.00 kB
. Vous pouvez rendre TypeScript heureux en faisantNumber((size / Math.pow(1024, i)).toFixed(2))
la même chose.Voici un prototype pour convertir un nombre en une chaîne lisible en respectant les nouvelles normes internationales.
https://wiki.ubuntu.com/UnitsPolicy
http://en.wikipedia.org/wiki/Template:Quantities_of_bytes
Cette fonction ne contient pas
loop
et est donc probablement plus rapide que certaines autres fonctions.Usage:
Préfixe CEI
Préfixe SI
J'ai défini l'IEC par défaut car j'ai toujours utilisé le mode binaire pour calculer la taille d'un fichier ... en utilisant la puissance de 1024
Si vous voulez juste l'un d'eux dans une fonction oneliner courte:
SI
IEC
Usage:
si vous avez des questions sur les fonctions, demandez
la source
.toFixed(e ? 2 : 0)
la source
\u200b
:'\u200bKMGTP'
.Solution en tant que composant ReactJS
MISE À JOUR Pour ceux qui utilisent es6, voici une version sans état de ce même composant
la source
${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]}
;Sur la base de l'idée de cocco , voici un exemple moins compact, mais j'espère plus complet.
la source
Je voulais le comportement du "gestionnaire de fichiers" (par exemple, l'Explorateur Windows) où le nombre de décimales est proportionnel à la taille du nombre. Apparemment, aucune des autres réponses ne fait cela.
Voici quelques exemples:
la source
+num.tofixed(2)
.toPrecision(3)
couvre pas tous ces cas? Oh .. Je suppose que cela ne couvre pas entre 1000 et 1023. Bummer.Un autre exemple similaire à ceux ici
Il mesure des performances sensiblement meilleures que les autres avec des fonctionnalités similaires.
la source
Voici le mien - fonctionne aussi pour les très gros fichiers -_-
la source
Basé sur la réponse de Cocco mais légèrement désugué (honnêtement, ceux avec lesquels j'étais à l'aise sont restés / ajoutés) et n'affiche pas de zéros à la fin mais prend toujours en charge 0, espérons être utile pour les autres:
la source
Votre solution est correcte. La chose importante à réaliser est que pour passer de
1551859712
à1.5
, vous devez faire des divisions par 1000, mais les octets sont comptés en morceaux binaires à décimaux de 1024, d'où la valeur de Gigabyte inférieure.la source
J'ai trouvé la réponse de @ cocco intéressante, mais j'ai eu les problèmes suivants:
Manuscrit:
la source
Ceci est l'amélioration de la taille de la réponse mpen
Afficher l'extrait de code
la source
Pour ceux qui utilisent
Angular
, il y a un paquet appeléangular-pipes
qui a un tuyau pour cela:Fichier
Usage
Lien vers les documents .
la source
Ma réponse pourrait être en retard, mais je suppose que cela aidera quelqu'un.
Préfixe métrique:
Préfixe binaire:
Exemples:
la source
laissez octets = 1024 * 10 * 10 * 10;
console.log (getReadableFileSizeString (octets))
renverra 1000.0Кб au lieu de 1MB
la source