J'ai posé la même question récemment :
Format file size as MB, GB, etc.
Bien qu'il n'y ait pas de réponse clé en main, je peux vivre avec la solution :
private static final long K = 1024;
private static final long M = K * K;
private static final long G = M * K;
private static final long T = G * K;
public static String convertToStringRepresentation(final long value){
final long[] dividers = new long[] { T, G, M, K, 1 };
final String[] units = new String[] { "TB", "GB", "MB", "KB", "B" };
if(value < 1)
throw new IllegalArgumentException("Invalid file size: " + value);
String result = null;
for(int i = 0; i < dividers.length; i++){
final long divider = dividers[i];
if(value >= divider){
result = format(value, divider, units[i]);
break;
}
}
return result;
}
private static String format(final long value,
final long divider,
final String unit){
final double result =
divider > 1 ? (double) value / (double) divider : (double) value;
return new DecimalFormat("#,##0.#").format(result) + " " + unit;
}
Code de test :
public static void main(final String[] args){
final long[] l = new long[] { 1l, 4343l, 43434334l, 3563543743l };
for(final long ll : l){
System.out.println(convertToStringRepresentation(ll));
}
}
Résultat (sur ma locale allemande) :
1 B
4,2 KB
41,4 MB
3,3 GB
J'ai ouvert une issue demandant cette fonctionnalité pour Google Guava. Peut-être que quelqu'un voudrait bien le soutenir.
41 votes
Si vous utilisez les unités normalisées, 1024 devrait devenir "1Kio" et 1024*1024 devrait devenir "1Mio". fr.wikipedia.org/wiki/Préfixe_binaire
0 votes
@Pascal : Il devrait y avoir plusieurs fonctions ou une option pour spécifier la base et l'unité.
0 votes
Possible duplicate de Format file size as MB, GB etc
4 votes
@Pascal Cuoq : Merci pour la référence. Je n'ai pas réalisé avant de le lire que ici dans l'UE, nous sommes tenus d'utiliser les bons préfixes par la loi.
2 votes
@DerMike Vous avez mentionné que "Jusqu'à ce qu'une telle bibliothèque existe". C'est maintenant devenu réalité. :-) stackoverflow.com/questions/3758606/…
1 votes
@AaronDigulla Vous avez raison. Pourquoi cette question datant de 2 mois a-t-elle été fermée en tant que doublon, et pas celle-ci ici ?
0 votes
Sujet similaire en Kotlin stackoverflow.com/q/59234916
1 votes
@hc_dev Je suppose que la question datant de 2 mois a été fermée parce que celle-ci avait de bien meilleures réponses. Ces questions ont toutes deux été posées en 2010, l'autre n'a pas été fermée avant 2013. (SO devrait vraiment avoir une fonction "fusionner les questions", si j'y pense, pour rassembler les réponses des deux ensemble en un seul endroit.)