jsp中freemarker 數字格式化詳解

來源:互聯網
上載者:User

一、使用內建函數 c
特點:
不管其表現形式是怎樣的(

 代碼如下 複製代碼
例如"123,456.123,456"、 "123 456.123 456"、 "000 123 456.123 456 000"、 "123,456.123 456"、 "1,2345,6.123456")

, 只要小數分割符是'.' 它就能轉化成電腦能夠識別的字串形式,而且都是123456.123456,電腦處理的時候是沒有那些所謂的千位分隔字元的(空格或逗號),而且電腦支援的最大的小數點後面的位元是16位,目前來說,已經夠我們用了。
用法:
假設strmun是一個字串形式的數字,則可以這樣寫  ${strnum?c},例如${"123,456.123,456"?c}  值為123456.123456
可能用處:
對一些表單允許使用者按照個人習慣輸入數字,提交的時候統一轉換
二、使用預定義的數字格式
有四種預定義的數字格式,分別是computer(跟內建函數c功能一樣,用法不一樣)、currency(貨幣格式)、number(數字格式)、percent(百分比形式)
特點:
這些格式的明確含義是本地化(國家)指定的,受 Java 平台安裝環境所控制,而不是 FreeMarker,所以不建議用這些函數,而且受預設數字格式的影響,用法不靈活。
 三、使用類似於Java中數字格式文法形式
特點:
例如"0.#",左邊的'0'的個數代表整數部分最少為多少位,右邊'#"的個數代表小數部分最多為多少位;例如",##0.0#"表示整數部分的千位分割符是',',小數部分最多保留兩位,最少保留一位;例如"0.##%"以百分比的形式表示,小數部分最多兩位。
用法:
假設strnum是一個數字,則可以這樣寫${strnum?string(",##0.0#")} ,例如${123456.123456?string(",##0.0#")}  值為123,456.12
注意:
數字格式是本地化敏感的,不過我們一般都會給freemarker設定預設的本地化語言,問題不大。
可能用處:
當在某一個地方突然要用到數字格式時,調用 string 函數是可以的,當在很多地方都需要用到數字格式是,這樣處理太麻煩了,可以考慮設定預設的數字格式化形式
四、局部設定
特點:
如果在某個頁面,或者某幾個頁面(其它頁面可import進來),用到的數字格式化是相同的,可考慮統一配置數位格式化形式
用法:
只需在用到需要格式化的數字之前 設定就可以了,格式如下: <#setting number_format=",##0.##">  其中",##0.##"的內容是採用類似於java中數字格式的文法形式,也就是以上的第三點。
注意:
如果用在一個頁面,則整個頁面預設就是那種格式,除非用string函數覆蓋了預設的格式,同樣的,如果放在一個公用的頁面,其它頁面只要include它,也會是同樣的格式。
五、全域設定
特點:
在所有的頁面都預設提供數位格式化形式
用法
(針對spring):在freemarker的設定檔中設定其預設的數字格式化形式,如下:

 代碼如下 複製代碼
< property name = "freemarkerSettings" >
          < props>
               .....
              < prop key = "number_format"> 0.## </prop >
                ......
          </props>
</property>


六、舍入處理
有幾種舍入處理方式,分別是  round,floor,ceiling 和string("0")
特點:
前面三種,從字面上很好理解,我們也經常使用,要說的最後一種,先看一個例子1.5?string("0")和2.5?string("0") 的值都是2 說明如下:
 在金融和統計學中,四捨五入都是根據所謂的一半原則,這就意味著對最近的“鄰居”進行四捨五入,除非離兩個鄰居距離相等,這種情況下,它四捨五入到偶數的鄰居。如果你注意看 1.5 和 2.5 的四捨五入的話,這在上面的樣本中是可以看到的,兩個都被四捨五入到2,因為 2 是偶數,但 1 和 3 是奇數。
用法:假設strnum是一個數字,則可以這樣寫${strnum?round(floor/ceiling)} 或者${strmun?string("0")}
可能用法:
可用在一些對數字精確度不高的情況(分頁處理時也許有用),一些對小數敏感的,還是用 string函數

例如:

 代碼如下 複製代碼
${num?string('0.00')}

如果小數點後不足兩位,用 0 代替

 代碼如下 複製代碼
${num?string('#.##')}

如果小數點後多餘兩位,就只保留兩位,否則輸出實際值
輸出為:1239765.46

 代碼如下 複製代碼
${num?string(',###.00')}
輸出為:1,239,765.46

整數部分每三位用 , 分割,並且保證小數點後保留兩位,不足用 0 代替

 代碼如下 複製代碼
${num?string(',###.##')}
輸出為:1,239,765.46

整數部分每三位用 , 分割,並且小數點後多餘兩位就只保留兩位,不足兩位就取實際位元,可以不不包含小數點

 代碼如下 複製代碼
${num?string('000.00')}
輸出為:012.70

整數部分如果不足三位(000),前面用0補齊,否則取實際的整數位

 代碼如下 複製代碼

${num?string('###.00')}
等價於
${num?string('#.00')}
輸出為:12.70

freemarker數字格式化帶來的操作問題

freemarker在解析資料格式的時候,自動預設將數字按3為分割(1,000),這個問題給操作帶來一定的額外處理複雜度,解決方案有如下幾種:

1、在模板中直接加.toString()轉化數字為字串,如:

 代碼如下 複製代碼
${languageList.id.toString()};

2、在freemarker設定檔freemarker.properties加

 代碼如下 複製代碼
<#setting number_format="#">或者      <#setting number_format="0">;

3、在模板中直接加<#setting number_format="#">或者<#setting number_format="0">,如:<#if

 代碼如下 複製代碼
AdminLanguagePaginationMsg?exists>
<#setting number_format="#">


對於數位格式化,可採用strng 和number_format 設定
數字格式化的優先順序:  string優先順序最高,設定檔配置的優先順序最低,在頁面setting的優先順序在兩者之間。


整數取實際的位元關於string指令的更多用法,可以訪問官方文檔:http://freemarker.sourceforge.net/docs/ref_builtins_number.html#ref_builtin_string_for_number

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.