有没有一种方便的方法可以在Freemarker中格式化一个人类可读的字节大小的字符串



对于Java(如何在Java中将字节大小转换为人类可读的格式?以及将文件大小格式化为MB、GB等),甚至对于Groovy/Grails(更不用说PHP),这个问题都有很多答案,但在FreeMarker中有内置或方便的方法吗?

为了清楚起见,我使用的是通用的SI方法,而不是2的二进制幂。例如

      1 ➤ 1B
    123 ➤ 123B
   1000 ➤ 1KB
   1728 ➤ 1.7KB
7077888 ➤ 7.1MB

等等。

考虑到FreeMarker似乎没有对数函数,有没有一种方法可以在纯FreeMarker中做到这一点,或者是我用Java创建模板方法的唯一选择。

如果有人感兴趣,我曾尝试过使用字符串操作自己编写代码。如果你能避免的话,我不建议你做这样的事情,但如果你陷入困境,它可能会有所帮助:

<#--
 # Format Number of Bytes in SI Units
 # -->
<#function si num>
  <#assign order     = num?round?c?length />
  <#assign thousands = ((order - 1) / 3)?floor />
  <#if (thousands < 0)><#assign thousands = 0 /></#if>
  <#assign siMap = [ {"factor": 1, "unit": ""}, {"factor": 1000, "unit": "K"}, {"factor": 1000000, "unit": "M"}, {"factor": 1000000000, "unit":"G"}, {"factor": 1000000000000, "unit": "T"} ]/>
  <#assign siStr = (num / (siMap[thousands].factor))?string("0.#") + siMap[thousands].unit />
  <#return siStr />
</#function>

不,.BTW中没有内置这样的功能,这应该只是一个number_format模式,但DecimalFormat没有这样的模式,所以FreeMarker也没有。

相关内容

最新更新