freemarker-number-formatter

freemarker是一款工作在java环境中的模板引擎。

他的格式化功能尤为高效,接下来我们了解一下freemarker的格式化功能。

搭建环境

我们使用mavel来管理我们的包依赖,因此,只需在pom.xml中配置包依赖即可:

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>

模板的使用

接下来,我们搭建一个可用的模板环境。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class FreemarkerUtil {
/**
* 获取模板
* @param name
* @return
*/
public Template getTemplate(String name) {
try {
//通过Freemaker的Configuration读取相应的ftl
Configuration cfg = new Configuration();
//设定去哪里读取相应的ftl模板文件
cfg.setClassForTemplateLoading(this.getClass(),"/");
//在模板文件目录中找到名称为name的文件
Template temp = cfg.getTemplate(name);
return temp;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 输出到控制台
* @param name 模板文件名
* @param root
*/
public void print(String name,Map<String,Object> root) {
try {
//通过Template可以将模板文件输出到相应的流
Template temp = this.getTemplate(name);
temp.process(root, new PrintWriter(System.out));
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 输出到文件
* @param name
* @param root
* @param outFile
*/
public void fprint(String name,Map<String,
Object> root,String outFile) {
FileWriter out = null;
try {
//通过一个文件输出流,就可以写到相应的文件中
out = new FileWriter(
new File(outFile));
Template temp = this.getTemplate(name);
temp.process(root, out);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} finally {
try {
if(out!=null) out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

在resources文件夹中创建一个test.ftl。

格式化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Created by gavin on 17-5-10.
*/
public class Main {
static FreemarkerUtil fu;
static Map<String,Object> root = null;
public static void main(String[] args) {
fu = new FreemarkerUtil();
root = new HashMap<String,Object>();
//1、创建数据模型
Map<String,Object> root = new HashMap<String,Object>();
//2、为数据模型添加值
root.put("num", 1234567890.0987654321);
root.put("date",new Date());
//3、将数据模型和模板组合的数据输出到控制台
fu.print("test.ftl", root);
}
}

test.ftl:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#{num} <#--正常输出-->
${num} <#--正常输出-->
${num?string} <#--格式化输出-->
${num?string.percent} <#--以百分比输出-->
${num?string.currency}<#--以当地金融符号输出-->
${num?string.$$}<#--在输出的字符串前加$$-->
${num?string["0.0"]}<#--至少保留一位小数和整数-->
${num?string["0000000000000000000000000000000000000.#"]}<#--有小数则只保留一位,整数部分位数少了用0添齐-->
${num?string["################################.#"]}<#--有小数则只保留一位,最多保留#数量的整数-->
${num?string(',###.00')}<#--保留至少两位小数,整数增加千分位-->
${num?string(",##0.0#")}<#--有小数则至少保留1位,最多2位,至少保留一位整数,整数以千分位分割。这个经常会用到,用以展示金钱等-->
${num?string(",##0.00%")}<#--小数至少保留2位,至少保留一位整数,整数以千分位分割,末尾增加%。这个经常会用到,用于展示百分比-->
${(num?string(",##0.0#"))!"error"}<#--同上,如果num为null则展示error-->
${date?string("yyyy-MM-dd HH:mm:ss zzzz")}<#--格式化日期-->

运行main函数即可看到效果。