2013-12-16 12 views
6

Ci sono molte risposte a questa domanda per Java (How to convert byte size into human readable format in java? e Format file size as MB, GB etc) e even for Groovy/Grails, per non parlare di PHP, ma c'è un modo integrato o conveniente per farlo in FreeMarker?Esiste un modo conveniente per formattare una stringa di dimensione byte leggibile in Freemarker?

Per chiarezza, sto seguendo il metodo SI generico nel linguaggio comune, piuttosto che i poteri binari di 2. E.g.

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

E così via.

Dato che FreeMarker non sembra avere una funzione di logaritmo, esiste un modo per farlo in puro FreeMarker, oppure è la mia unica opzione per creare un metodo di template con Java.

+0

OK. Sembra che se stai usando il Funnelback (come sono), c'è una funzione fornita chiamata 'filesize()' che raggiunge il risultato desiderato. –

+0

FreeMarker stesso non definisce 'filesize()'. Qualcos'altro lo mette lì nel tuo ambiente. – ddekany

+0

@ddekany Sì. Lo so. [Funnelback] (http://funelback.com) è ciò che sta mettendo lì. –

risposta

0

No, non esiste tale funzionalità integrata. BTW, dovrebbe essere solo uno schema number_format, ma DecimalFormat non ha pattern che lo fa, quindi FreeMarker non ha nemmeno questo.

3

Nel caso in cui qualcuno fosse interessato, ho avuto una crepa a codificare qualcosa usando la manipolazione delle stringhe. Non consiglierei di fare qualcosa del genere se puoi evitarlo, ma se sei bloccato, potrebbe essere d'aiuto:

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

(Non correlato, ma non è necessario '()' -s dopo '# if' in FreeMarker. Non fanno nulla.) – ddekany

+0

@ddekany Hai ragione. A meno che, naturalmente, tu stia facendo un confronto "maggiore di". Ad esempio, '<#if (num > 3)>' [come descritto nella documentazione di Freemarker] (http://freemarker.org/docs/ref_directive_if.html#ref.directive.if). Personalmente, mi piace tenere le parentesi lì in modo da non dimenticarle quando scrivo un confronto più grande. –

Problemi correlati