freemarker数字格式化的必要性

freemarker在解析数据格式的时候,自动默认将数字按3为分割(1,000),这个问题给操作带来一定的额外处理复杂度,解决方法有如下几种:

1、在模板中直接加.toString()转化数字为字符串,如:${languageList.id.toString()};

2、在freemarker配置文件freemarker.properties加number_format=#或者number_format=0;

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

<#if AdminLanguagePaginationMsg?exists> 
<#setting number_format="#">

一、使用内建函数c

不管其表现形式是怎样的,例如:"123,456.123,456"、"123456.123456"、"000123456.123456000"、"123,456.123456"、"1,2345,6.123456"等,只要小数分割符是'.',它就能转化成计算机能够识别的字符串形式,而且都是123456.123456,计算机处理的时候是没有那些所谓的千位分隔符的(空格或逗号),而且计算机支持的最大的小数点后面的位数是16位,目前来说,已经够我们用了。

用法举例:

假设strmun是一个字符串形式的数字,则可以这样写${strnum?c}。例如:${"123,456.123,456"?c}值为123456.123456

二、使用预定义的数字格式

Freemarker中预定义了三种数字格式:number,currency(货币)和percent(百分比),其中number为默认的数字格式转换

例如:

<#assign tempNum=20>

${tempNum}    
${tempNum?string.number}或${tempNum?string("number")}  //结果为20
${tempNum?string.currency}或${tempNum?string("currency")} //结果为¥20.00
${tempNum?string. percent}或${tempNum?string("percent")} //结果为2,000%

实际上我们在日常的开发过程中遇到的比较多的问题就是货币的展示,对于货币而言,在不同的地区是有不同的符号的。因此,freemarker为我们提供了方便的方式实现。

<#assign x=42> 
${x?string.currency}

上述的表达式最终的结果将是¥42.00,这个功能看起来很不错!

三、使用类似于Java中数字格式语法形式

例如"0.#",左边的'0'的个数代表整数部分最少为多少位,右边'#"的个数代表小数部分最多为多少位。

例如:",##0.0#" 表示整数部分的千位分割符是',',小数部分最多保留两位,最少保留一位;例如"0.##%"以百分比的形式表示,小数部分最多两位。

假设strnum是一个数字,则可以这样写${strnum?string(",##0.0#")},例如${123456.123456?string(",##0.0#")}值为123,456.12

四、局部设置

如果在某个页面,或者某几个页面(其它页面可import进来),用到的数字格式化是相同的,可考虑统一配置数字的格式化形式

只需在用到需要格式化的数字之前设置就可以了,格式如下:<#settingnumber_format=",##0.##">其中",##0.##"的内容是采用类似于Java中数字格式的语法形式,也就是以上的第三点。

注意:
如果用在一个页面,则整个页面默认就是那种格式,除非用string函数覆盖了默认的格式,同样的,如果放在一个公共的页面,其它页面只要include它,也会是同样的格式。

五、全局设置

在所有的页面都默认提供数字的格式化形式

用法介绍:

针对spring环境下,在freemarker的配置文件中设置其默认的数字格式化形式,如下:

<propertyname="freemarkerSettings"> 
<props> 
..... 
<propkey="number_format">0.##</prop> 
...... 
</props> 
</property> 

六、四舍五入

(1)round:四舍五入
(2)floor:向下取整
(3)ceiling:向上取整

<#--freemarker中的round、floor和ceiling数字的舍入处理-->
<#--round:四舍五入-->
<#--floor:向下取整-->
<#--ceiling:向上取整-->

<#assign numList = [12,0.23,89,12.03,69.56,45.67,-0.56,-8.05,-89.56,4.69]/>
<#list numList as num>
 ${num} ?round=${num?round} ?floor=${num?floor} ?ceiling=${num?ceiling}
</#list>

结果为:

12 ?round=12 ?floor=12 ?ceiling=12
0.23 ?round=0 ?floor=0 ?ceiling=1
89 ?round=89 ?floor=89 ?ceiling=89
12.03 ?round=12 ?floor=12 ?ceiling=13
69.56 ?round=70 ?floor=69 ?ceiling=70
45.67 ?round=46 ?floor=45 ?ceiling=46
-0.56 ?round=-1 ?floor=-1 ?ceiling=0
-8.05 ?round=-8 ?floor=-9 ?ceiling=-8
-89.56 ?round=-90 ?floor=-90 ?ceiling=-89
4.69 ?round=5 ?floor=4 ?ceiling=5