String 有没有一种方便的方法可以在Freemarker中格式化人类可读的字节大小字符串?
对于Java(、和)这个问题有很多答案,更不用说,但是在FreeMarker中有内置的或方便的方法来实现这一点吗 为了清楚起见,我使用通用的SI方法,而不是2的二元幂。例如String 有没有一种方便的方法可以在Freemarker中格式化人类可读的字节大小字符串?,string,numbers,format,freemarker,funnelback,String,Numbers,Format,Freemarker,Funnelback,对于Java(、和)这个问题有很多答案,更不用说,但是在FreeMarker中有内置的或方便的方法来实现这一点吗 为了清楚起见,我使用通用的SI方法,而不是2的二元幂。例如 1 ➤ 1B 123 ➤ 123B 1000 ➤ 1KB 1728 ➤ 1.7KB 7077888 ➤ 7.1MB 等等 鉴于FreeMarker似乎没有对数函数,有没有办法在纯FreeMarker中实现这一点,或者是我用Java创建模板方法的唯一选择。没有,没有内置这样的功能。顺便说一句,
1 ➤ 1B
123 ➤ 123B
1000 ➤ 1KB
1728 ➤ 1.7KB
7077888 ➤ 7.1MB
等等
鉴于FreeMarker似乎没有对数函数,有没有办法在纯FreeMarker中实现这一点,或者是我用Java创建模板方法的唯一选择。没有,没有内置这样的功能。顺便说一句,这应该只是一个
number\u格式
模式,但是DecimalFormat
没有这样的模式,所以FreeMarker也没有。如果有人感兴趣的话,我自己就很擅长使用字符串操作编写代码。如果你可以避免,我不建议你做这样的事情,但如果你陷入困境,这可能会有帮助:
<#--
# 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>
OK。似乎如果您使用的是Funnelback(就像我一样),那么提供了一个名为filesize()
的函数来实现所需的结果。FreeMarker本身并不定义filesize()
。其他东西会把它放在你的环境中。@ddekany是的。我知道。是什么把它放在那里。(无关,但你不需要()
-s在#如果在FreeMarker中。他们什么都不做。)@ddekany你是对的。当然,除非你在做一个“大于”的比较。例如3)>
。就我个人而言,我喜欢把括号放在那里,这样当我写一篇大于比较的文章时,我就不会忘记它们。