java替换字符串模板渲染
使用内置String.format
String message = String.format("您好%s,晚上好!您目前余额:%.2f元,积分:%d","张三", 10.155, 10);
System.out.println(message);
//您好张三,晚上好!您目前余额:10.16元,积分:10
使用内置的MessageFormat
String message1 = MessageFormat.format("您好{0},晚上好!您目前余额:{1,number,#.##}元,积分:{2}", "张三", 10.155, 10);
System.out.println(message);
//您好张三,晚上好!您目前余额:10.16元,积分:10
``注意:1.如果最后结果想加上一个单引号,就需要在相应占位符上加上两个单引号,才能准确转换。`
2.如果传入的参数为null,会自动替换为null。如果想替换为空白或者其他的字符,可以使用StringUtils.defaultIfBlank(d,"结果") 替换
3.少用StringBuilder的toString 每次调用toString方法,会重新new一个String出来。
在java.lang.String的代码中,value并不是直接指向的,而是通过系统拷贝函数进行的内存操作,
**``如果toString太多的话,CPU会一直忙于进行内存的分配工作,会导致机器的load过高。```
案例
/**
* java替换字符串测试
*/
@Test
public void replaceCharTest() {
// 方式一:使用内置String.format()
String message = String.format("您好%s,晚上好!您目前余额:%.2f元,积分:%d","张三", 10.155, 10);
// 输出:您好张三,晚上好!您目前余额:10.16元,积分:10
System.out.println(message);
// 方式二:使用内置的MessageFormat
String message1 = MessageFormat.format("您好{0},晚上好!您目前余额:{1,number,#.##}元,积分:{2}", "张三", 10.155, 10);
// 输出:您好张三,晚上好!您目前余额:10.15元,积分:10
System.out.println(message1);
String a= "aaa";
String b= "bb";
String c= "c";
StringBuilder sb = new StringBuilder();
sb.append(a).append(b).append(c);
System.out.println(MessageFormat.format(" {0} {1} {2} {3}", a, b,"",sb));
// 输出: aaa bb aaabbc
System.out.println(MessageFormat.format(" ''{0}'' '{1}' {2} {3}", a, b,"",sb.toString()));
// 输出 'aaa' {1} aaabbc
String d = null;
System.out.println(MessageFormat.format(" {0}", d));
// 输出:null
System.out.println(MessageFormat.format(" {0}", StringUtils.defaultIfBlank(d,"结果")));
// 输出:结果
}
MessageFormat使用规则
FormatElement:
{ ArgumentIndex }:是从0开始的入参位置索引。
{ ArgumentIndex , FormatType }
{ ArgumentIndex , FormatType , FormatStyle }
FormatType: :指定使用不同的Format子类对入参进行格式化处理。值范围如下:
number:调用NumberFormat进行格式化
date:调用DateFormat进行格式化
time:调用DateFormat进行格式化
choice:调用ChoiceFormat进行格式化
FormatStyle::设置FormatType中使用的格式化样式。值范围如下:
short
medium
long
full
integer
currency
percent
SubformatPattern (子格式模式,形如#.##)
以str为例,在这个字符串中:
1. {0} 和 {1,number,short} 和 {2,number,#.#}; 都属于FormatElement,0,1,2是ArgumentIndex。
2. {1,number,short} 里面的number属于FormatType,short则属于FormatStyle。
3. {1,number,#.#} 里面的#.#就属于子格式模式。