用Java/JSTL格式化文件大小

用Java/JSTL格式化文件大小,java,jsp,formatting,jstl,Java,Jsp,Formatting,Jstl,我想知道是否有人知道在Java/JSP/JSTL页面中格式化文件大小的好方法 是否有一个用于执行此操作的util类? 我搜索了公共场所,但什么也没找到。有自定义标签吗? 是否已经存在用于此的库 理想情况下,我希望它的行为类似于Unix的ls命令上的-h开关 34->34 795->795 2646->2.6K 2705->2.7K 4096->4.0K 13588->14K 28282471->27M 28533748->28M一次快速的谷歌搜索让我从Appache hadoop项目返回。从那里

我想知道是否有人知道在Java/JSP/JSTL页面中格式化文件大小的好方法

是否有一个用于执行此操作的util类?
我搜索了公共场所,但什么也没找到。有自定义标签吗?
是否已经存在用于此的库

理想情况下,我希望它的行为类似于Unix的ls命令上的-h开关

34->34
795->795
2646->2.6K
2705->2.7K
4096->4.0K
13588->14K
28282471->27M

28533748->28M

一次快速的谷歌搜索让我从Appache hadoop项目返回。从那里复制: (Apache许可证,版本2.0):

private static DecimalFormat oneDecimal=新的DecimalFormat(“0.0”);
/**
*给定一个整数,返回一个近似的字符串
*可读格式。
*它使用基数“k”、“m”和“g”表示1024、1024**2和1024**3。
*@param number要格式化的数字
*@返回一个可读的整数形式
*/
公共静态字符串humanReadableInt(长数字){
长absNumber=Math.abs(number);
双结果=数字;
字符串后缀=”;
如果(absNumber<1024){
//没什么
}else if(absNumber<1024*1024){
结果=数量/1024.0;
后缀=“k”;
}else if(absNumber<1024*1024*1024){
结果=数量/(1024.0*1024);
后缀=“m”;
}否则{
结果=数量/(1024.0*1024*1024);
后缀=“g”;
}
返回一位小数。格式(结果)+后缀;
}

它使用1K=1024,但如果您愿意,可以对此进行调整。您还需要处理您可以使用commons io
FileUtils.byteCountToDisplaySize方法。对于JSTL实现,您可以在类路径上具有commons io的同时添加以下taglib函数:


文件大小
org.apache.commons.io.FileUtils
字符串字节计数显示大小(长)
现在,您可以在JSP中执行以下操作:


某些大小:${sz:fileSize(1024)}
某些大小:${sz:fileSize(10485760)}
有关更清洁的解决方案,请参阅
private static DecimalFormat oneDecimal = new DecimalFormat("0.0");

  /**
   * Given an integer, return a string that is in an approximate, but human 
   * readable format. 
   * It uses the bases 'k', 'm', and 'g' for 1024, 1024**2, and 1024**3.
   * @param number the number to format
   * @return a human readable form of the integer
   */
  public static String humanReadableInt(long number) {
    long absNumber = Math.abs(number);
    double result = number;
    String suffix = "";
    if (absNumber < 1024) {
      // nothing
    } else if (absNumber < 1024 * 1024) {
      result = number / 1024.0;
      suffix = "k";
    } else if (absNumber < 1024 * 1024 * 1024) {
      result = number / (1024.0 * 1024);
      suffix = "m";
    } else {
      result = number / (1024.0 * 1024 * 1024);
      suffix = "g";
    }
    return oneDecimal.format(result) + suffix;
  }