对于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也没有。