【问题标题】:Is there a convenient way to format a human readable byte size string in Freemarker?有没有一种方便的方法可以在 Freemarker 中格式化人类可读的字节大小字符串?
【发布时间】:2013-12-16 03:03:34
【问题描述】:

对于 Java(How to convert byte size into human readable format in java?Format file size as MB, GB etc)和even for Groovy/Grails,这个问题有很多答案,更不用说PHP,但是在 FreeMarker 中是否有内置或方便的方法来做到这一点?

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

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

等等。

鉴于 FreeMarker 似乎没有对数函数,有没有办法在纯 FreeMarker 中做到这一点,或者是我使用 Java 创建模板方法的唯一选择。

【问题讨论】:

  • 好的。似乎如果您正在使用 Funnelback(就像我一样),则提供了一个名为 filesize() 的函数可以达到预期的结果。
  • FreeMarker 本身没有定义filesize()。其他东西把它放在你的环境中。
  • @ddekany 是的。我知道。 Funnelback 就是把它放在那里。

标签: string numbers format freemarker funnelback


【解决方案1】:

如果有人感兴趣,我可以自己使用字符串操作来编写代码。如果可以避免,我不建议您这样做,但如果您遇到困难,它可能会有所帮助:

<#--
 # 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>

【讨论】:

  • (无关,但你不需要在 FreeMarker 中 #if 之后的 ()-s。他们什么都不做。)
  • @ddekany 你是对的。当然,除非您正在进行“大于”比较。例如&lt;#if (num &gt; 3)&gt;as described in the Freemarker docs。就个人而言,我喜欢把括号保留在里面,这样当我写大于比较时就不会忘记它们。
【解决方案2】:

不,没有内置这样的功能。顺便说一句,这应该只是一个 number_format 模式,但 DecimalFormat 没有这样做的模式,所以 FreeMarker 也没有。

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2010-12-05
    相关资源
    最近更新 更多