java里的格式化

今天看到帖子www.oschina.net/code/snippet_436266_45306,用字符串数组替换字符串中“出库单号?可导出DRP的出库数量为?,不需要导入目标系统!“ 的问号。
我写的是:
String str="出库单号?可导出DRP的出库数量为?,不需要导入目标系统!";
String[] paras = new String[]{"1000001","99"};
for(String para : paras){
    str = str.replaceFirst("\\?", para);
}
System.out.println(str);

看了答案,总结下:
1.MessageFormat,没发现MessageFormat怎么替换问号,可以做模板替换
MessageFormat用法:

String pig = "{0}{1,number,#.##}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}";
String result = MessageFormat.format(pig,"A",5.5,"C","D","E","F","G","H","I","G","K","L","M","N","O","P","Q");
System.out.println(result);
//		最终结果是:ABCDEFGHIJKLMNOPQ

String message = "oh, {0} is 'a' pig";  
result = MessageFormat.format(message, "ZhangSan"); 
System.out.println(result);
//		最终结果是:oh, ZhangSan is a pig


message = "oh, {0} is ''a'' pig";  
result = new MessageFormat(message).format(message, "Zhangsan");
System.out.println(result);
Object[] objs = new Object[]{"张三"};
result = new MessageFormat(message).format(objs);
System.out.println(result);
//		最终结果是:oh, ZhangSan is 'a' pig

message = "oh, '{0}' is a pig";
System.out.println(MessageFormat.format(message, "ZhangSan"));
//		最终结果是:oh, {0} is 'a' pig,此处ZhangSan无法显示。
message = "oh, '{0,number,#.#} is a pig";  
result = MessageFormat.format(message, 100.5);
System.out.println(result);
result = new MessageFormat(message).format(new Object[]{100.5});
System.out.println(result);
//		最终结果是:oh, {0,number,#.#}  is 'a' pig。

message = "oh, {0,number,#.#} is a pig";
System.out.println(MessageFormat. format(message, 3.1));
//		最终结果是:oh, 3.1 is a pig

message = "oh, { is a pig";
//		最终结果是:异常java.lang.IllegalArgumentException: Unmatched braces in the pattern

message = "oh, } is a pig";
//		最终结果是:oh, } is a pig

message = "欢迎光临,当前({0})等待的业务受理的顾客有{1}位,请排号办理业务!";
result =MessageFormat.format(message, new Date(),35);
System.out.println(result);
//		最终结果是:欢迎光临,当前(15-1-20 下午11:17)等待的业务受理的顾客有35位,请排号办理业务! 
message = "欢迎光临,当前({0,date,full})等待的业务受理的顾客有{1}位,请排号办理业务!";
result =MessageFormat.format(message, new Date(),35);
System.out.println(result);
//		最终结果是:欢迎光临,当前(2015年1月20日 星期二)等待的业务受理的顾客有35位,请排号办理业务! 

/*
 * 原始的是:"oh, '{0,number,#.#} is a pig";这种的,原始的调用 new MessageFormat(pattern).format(Object para);
 * 引号 大小括号了解。
 */

补充20150528:
注意单引号引用:

	System.out.println(MessageFormat.format("您好{0},您的<a class=''blue'' target=''_blank'' href=''/resume/{1}.html''>个人挂证信息</a>已被审核入库,这几天请保持您的电话畅通以便企业/猎头与您联系!", 123,"456"));



正常输出:
您好123,您的<a class='blue' target='_blank' href='/resume/456.html'>个人挂证信息</a>已被审核入库,这几天请保持您的电话畅通以便企业/猎头与您联系!
改成:
System.out.println(MessageFormat.format("您好{0},您的<a class=''blue'' target=''_blank'' href='/resume/{1}.html'>个人挂证信息</a>已被审核入库,这几天请保持您的电话畅通以便企业/猎头与您联系!", 123,"456"));



输出:
您好123,您的<a class='blue' target='_blank' href=/resume/{1}.html>个人挂证信息</a>已被审核入库,这几天请保持您的电话畅通以便企业/猎头与您联系!
输出没替换!
支持的类型等看文档吧!


2.其中一答案
String str="出库单号?可导出DRP的出库数量为?,不需要导入目标系统!";
String[] paras = new String[]{"1000001","99"};
System.out.println(String.format(str, paras));



String.format实际调用
new Formatter().format(str, paras).toString()



java.util.Formatter也是格式化所用,System.out.printf()实际调用java.util.Formatter(了解)
Formatter f1 = new Formatter(System.out);
                //格式化输出字符串和数字
                f1.format("格式化输出:%s %d", "a", 1235);
                System.out.println("\n--------");
                //日期的格式化
                Calendar c = new GregorianCalendar();
                f1.format("当前日期:%1$tY-%1$tm-%1$te", c);
                System.out.println("\n--------");
                //日期的格式化,并将格式化结果存储到一个字符串变量中
                String s = String.format("当前日期:%1$tY-%1$tm-%1$te", c);
                System.out.println(s);
                //2$:取第二个参数
                //-: 指定为左对齐,默认右对齐
                //5:最大输出宽度为20,不够会补空格,实际若超过则全部输出
                //.2:在此表示输出参数2的最大字符数量,如果是浮点数字,则表示小数部分显示的位数
                //s :表示输入参数是字符串
                f1.format("%2$-5.2s %1$2s", "123", "456");

                //将格式化的结果存储到字符串
                System.out.println("\n--------");
                String fs = String.format("身高体重(%.2f , %d)", 173.2, 65);
                System.out.println(fs);

                //printf()本质上也是用System.out作为输出目标构造Formatter对象
                //调用format方法,并将printf的参数传给format方法而得。
                System.out.println("\n--------");
                System.out.printf("身高体重(%.2f , %d)", 180.2, 65);

3.java.text.Format为抽象类,子类有DateFormat,MessageFormat,NumberFormat
4.模板替换工具类
大致这个意思:http://my.oschina.net/haogrgr/blog/222349
5.复下正则

Matcher matcher = Pattern.compile("\\?").matcher(str);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < paras.length && matcher.find(); i++) {
	matcher.appendReplacement(sb, paras[i]);
}
matcher.appendTail(sb);
System.out.println(sb.toString());



结束:1.java的格式化真复杂!2.在系统中的短信模板等都提取出来,放在配置文件里。


你可能感兴趣的:(java里的格式化)