J'ai besoin d'afficher la taille d'un fichier sous forme de chaîne de caractères en utilisant des unités sensibles.
Par exemple,
1L ==> "1 B";
1024L ==> "1 KB";
2537253L ==> "2.3 MB"
etc.
J'ai trouvé cette réponse précédente ce que je n'ai pas trouvé satisfaisant.
J'ai trouvé ma propre solution qui présente les mêmes inconvénients :
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 String.format("%.1f %s", Double.valueOf(result), unit);
}
Le principal problème est ma connaissance limitée du format décimal et / ou du format String.format. J'aimerais que 1024L, 1025L, etc. soient convertis en 1 KB
plutôt que 1.0 KB
.
Donc, deux possibilités :
- Je préférerais une bonne solution prête à l'emploi dans une bibliothèque publique telle que Apache Commons o Google Guava .
- Si ce n'est pas le cas, comment puis-je me débarrasser de la partie '.0' (sans avoir recours au remplacement de chaînes de caractères et aux expressions rationnelles, je peux le faire moi-même) ?
0 votes
Vous aimerez peut-être [la réponse ici] [1] car il s'agit d'une solution vraiment efficace, qui respecte les normes SI. [1] : stackoverflow.com/questions/3758606/
0 votes
Je suis au courant de cette question (et de la réponse acceptée), j'ai également a posté une réponse ici en faisant référence à cette question. Cette question est venue en premier, cependant, et n'a pas reçu une si bonne réponse.
0 votes
C'est ma faute, je n'avais pas remarqué que c'était vous qui aviez posté le lien vers cette question sur l'autre. C'est en fait comme ça que je suis arrivé ici.
6 votes
Voir cette réponse : stackoverflow.com/a/3758880/34088
0 votes
Je sais. J'aurais accepté celle-là, si elle avait été postée ici.
0 votes
Si vous changez la dernière ligne pour retourner NumberFormat.getFormat("#,##0.#").format(result) + " " + unit ; cela fonctionne aussi dans GWT ! Merci pour cela, ce n'est toujours pas dans Guava.
1 votes
Selon la norme ISO, le kilo est exprimé avec un "k" minuscule.
0 votes
Vous pouvez essayer la bibliothèque Open Source triava. Si vous passez un DecimalFormat approprié, vous pouvez obtenir la sortie "1 KB" souhaitée. Vous trouverez des exemples d'utilisation dans stackoverflow.com/a/38390338/1280825 y github.com/trivago/triava/blob/master/src/test/java/com/trivago/ .