2013-12-16 54 views
6

對於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中有這樣一個內置或便捷的方法嗎?爲了清楚起見,我使用普通的術語,而不是2的二進制冪。有沒有一種方便的方法在Freemarker中格式化人類可讀的字節大小字符串?

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

依此類推。

鑑於FreeMarker似乎沒有對數函數,是否有一種方法可以在純FreeMarker中執行此操作,或者是我唯一選擇使用Java創建模板方法的方法。

+0

好的。似乎如果你使用Funnelback(就像我),有一個名爲'filesize()'的提供的函數可以達到所需的結果。 –

+0

FreeMarker本身沒有定義'filesize()'。還有一些東西把它放在你的環境中。 – ddekany

+0

@ddekany是的。我知道。 [Funnelback](http://funelback.com)是把它放在那裏。 –

回答

0

沒有,有沒有內置這樣的功能。順便說一句,這應該只是一個number_format格局,但DecimalFormat沒有模式,做這個,所以FreeMarker的沒有它的。

3

如果有人感興趣,我在使用字符串操作編碼自己的東西時遇到了麻煩。如果你可以避免這樣做,我不會推薦做這樣的事情,但如果你卡住了,它可能會有所幫助:

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

(不相關,但是你不需要在FreeMarker的'#if'後面加'()'-s,它們什麼也不做) – ddekany

+0

@ddekany你說得對。當然,除非你正在進行「大於」比較。例如'[<#if (num > 3)>'[如Freemarker文檔中所述](http://freemarker.org/docs/ref_directive_if.html#ref.directive.if)。就我個人而言,我喜歡把括號放在那裏,所以當我寫一個比較大的比較時,我不會忘記它們。 –

相關問題