Comment convertir la taille des octets en format lisible par l'homme en Java? Comme 1024 devrait devenir "1 Kb" et 1024 * 1024 devrait devenir "1 Mb".
J'en ai assez d'écrire cette méthode d'utilité pour chaque projet. Existe-t-il des méthodes statiques dans Apache Commons pour cela?
java
formatting
apache-commons
Igor Mukhin
la source
la source
Réponses:
Source: Formatage de la taille des octets au format lisible par l'homme | Guide de programmation
SI (1 k = 1000)
Binaire (1 K = 1024)
Exemple de sortie:
la source
du
commande sous Linux.)FileUtils.byteCountToDisplaySize(long size)
fonctionnerait si votre projet pouvait dépendreorg.apache.commons.io
.JavaDoc pour cette méthode
la source
Utiliser la classe intégrée Android
Pour Android, il existe un formateur de classe . Une seule ligne de code et vous avez terminé.
C'est comme
formatFileSize()
, mais en essayant de générer des nombres plus courts (montrant moins de décimales).Formate une taille de contenu sous forme d'octets, kilo-octets, mégaoctets, etc.
la source
Context
.Nous pouvons complètement éviter d'utiliser les méthodes slow
Math.pow()
etMath.log()
sans sacrifier la simplicité puisque le facteur entre les unités (par exemple B, KB, MB etc.) est 1024, ce qui est 2 ^ 10. LaLong
classe a unenumberOfLeadingZeros()
méthode pratique que nous pouvons utiliser pour dire dans quelle unité la valeur de taille se situe.Point clé: les unités de taille ont une distance de 10 bits (1024 = 2 ^ 10), ce qui signifie que la position du 1 bit le plus élevé - ou en d'autres termes le nombre de zéros en tête - diffère de 10 (octets = Ko * 1024, Ko = Mo * 1024 etc.).
Corrélation entre le nombre de zéros en tête et l'unité de taille:
Le code final:
la source
J'ai posé la même question récemment:
Formater la taille du fichier en Mo, Go, etc.
Bien qu'il n'y ait pas de réponse prête à l'emploi, je peux vivre avec la solution:
Code de test:
Sortie (sur mes paramètres régionaux allemands):
Modifier: j'ai ouvert un problème demandant cette fonctionnalité pour Google Guava . Peut-être que quelqu'un voudrait le soutenir.
la source
Il s'agit d'une version modifiée de la réponse d' Aioobe .
Changements:
Locale
, car certaines langues utilisent.
et d'autres,
comme point décimal.la source
Si vous utilisez Android, vous pouvez simplement utiliser android.text.format.Formatter.formatFileSize () .
Alternativement, voici une solution basée sur ce post populaire :
Ou à Kotlin:
la source
unitsCount
et nonunitsCount-1
.if(result<unit) break;
va démarrer avant cela. Pas de soucis. (Si vous le testez, vous remarquerez que vous pouvez ignorer entièrement la condition de boucle.)la source
la source
Unités d'octets vous permet de le faire comme ceci:
J'ai écrit une autre bibliothèque appelée unités de stockage qui vous permet de le faire comme ceci:
Si vous souhaitez forcer une certaine unité, procédez comme suit:
la source
la source
Il existe désormais une bibliothèque contenant le formatage des unités. Je l'ai ajouté à la bibliothèque triava , car la seule autre bibliothèque existante semble être une pour Android.
Il peut formater des nombres avec une précision arbitraire, dans 3 systèmes différents (SI, IEC, JEDEC) et diverses options de sortie. Voici quelques exemples de code issus des tests unitaires triava :
Impression du kilo exact, des méga valeurs (ici avec W = Watt):
Vous pouvez passer un DecimalFormat pour personnaliser la sortie:
Pour des opérations arbitraires sur des kilos ou des méga valeurs, vous pouvez les diviser en composants:
la source
Je sais qu'il est trop tard pour mettre à jour ce post! mais je me suis amusé avec ça:
Créez une interface:
Créer une classe StorageUnits:
Appeler:
Production:
la source
Dans le cas contraire, cela fait gagner du temps à quelqu'un, ou peut-être juste pour un peu de plaisir, voici une version Go. Par souci de simplicité, je n'ai inclus que le cas de sortie binaire.
la source
Ajoutez simplement plus d'unités de fichier (le cas échéant), et vous verrez la taille de l'unité jusqu'à cette unité (si votre fichier a autant de longueur) System.out.println ("Taille de fichier au format approprié:" + octets + "" + fileSizeUnits [indice]); sizeToReturn = String.valueOf (bytes) + "" + fileSizeUnits [index]; return sizeToReturn; }
la source
Voici l'équivalent C # .net pour la réponse de consensus correcte Java ci-dessus. (il y a un autre ci-dessous qui a des codes plus courts)
Techniquement parlant, si nous nous en tenons aux unités SI, cette routine fonctionne pour toute utilisation régulière des nombres. Il existe de nombreuses autres bonnes réponses d'experts. Supposons que vous effectuez une liaison de données de nombres sur des vues de grille, cela vaut la peine de vérifier leurs routines optimisées pour les performances.
PS: Publié parce que cette question / réponse est apparue en tête de la recherche Google pendant que je fais un projet C #.
la source
Vous pouvez utiliser StringUtils les s de
TraditionalBinarPrefix
:la source
peu vieux mais, ... org.springframework.util.unit.DataSize pourrait convenir à cette exigence au moins pour le calcul, alors un simple décorateur fera l'affaire
la source
la source
Avez-vous essayé JSR 363 ? Ses modules d'extension d'unité comme Unicode CLDR (dans GitHub: uom-systems ) font tout cela pour vous.
Vous pouvez utiliser
MetricPrefix
inclus dans chaque implémentation ouBinaryPrefix
(comparable à certains des exemples ci-dessus) et si vous vivez et travaillez par exemple en Inde ou dans un pays voisin,IndianPrefix
(également dans le module commun de uom-systems) vous permet d'utiliser et de formater "Crore Octets "ou" octets Lakh ", aussi.la source
Vous pouvez peut-être utiliser ce code (en C #):
la source
la source
Utilisez la fonction suivante pour obtenir des informations exactes, générées en prenant la base du
ATM_CashWithdrawl
concept.Je viens de modifier le code de facebookarchive-
StringUtils
pour obtenir le format ci-dessous. Même format que vous obtiendrez lorsque vous utiliserez apache.hadoop-StringUtils
Exemple d'utilisation des méthodes ci-dessus:
Octets pour obtenir au-dessus du format
Afin d'afficher l'heure dans un format lisible par l'homme, utilisez cette fonction
millisToShortDHMS(long duration)
.la source
voici la conversion de @aioobe convertie en kotlin
la source