JAVA中的format

1.    java.text.Format 2

1.1.     Format的方法... 2

1.2.     Format的子类... 2

1.3.     DateFormat的用法... 2

1.4.     MessageFormat的用法... 2

1.5.     NumberFormat的用法... 3

1.5.1.      NumberFormat的介绍... 3

1.5.2.      子类DecimalFormat 3

1.5.3.      子类ChoiceFormat 3

1.5.4.      ChoiceFormat的例子... 3

1.5.5.      ChoiceFormat的pattern构造方法... 4

1.5.6.      其它的数字格式化... 4

2.    java.util.Formatter. 5

2.1.     介绍... 5

2.2.     转换(conversion) 5

2.2.1.      常规... 5

2.2.2.      字符... 6

2.2.3.      整数... 6

2.2.4.      浮点... 6

2.2.5.      日期/时间... 6

2.2.6.      百分比... 6

2.2.7.      行分隔符... 6

2.3.     标志(flags) 6

2.4.     宽度(width) 6

2.5.     精度(.precision) 6

3.    java.util.regex.Pattern. 7

3.1.     介绍... 7

3.2.     关于regex. 7

3.3.     Matcher(匹配器) 7

 


在Java中,有java.text.Format,java.util.Formatter,java.util.regex.Pattern三个格式化相关的体系,使用起来较为复杂,在这里总结一下。

1.        java.text.Format

1.1.       Format的方法

java.text.Format做为一个抽象类,有二个抽象方法,

format(Object obj, StringBuffer toAppendTo,FieldPosition pos):格式化一个对象,并将得到的文本追加到给定的字符缓冲区。是将obj格式化为字符串,并加入到toAppendTo中。

parseObject(String source, ParsePosition pos): 分析字符串文本,生成一个对象。是format方法的逆向方法,将String转化为Object。

另外的formatparseObject这两个方法的重载。

方法formatToCharacterIterator(Objectobj)并非抽象方法,api上要求子类必须实现这个方法。

1.2.       Format的子类

Java 2 平台为格式化日期、消息和数字分别提供了三个特殊的 Format 的子类:DateFormat(抽象类)、MessageFormat和 NumberFormat(抽象类)。

           ——>DateFormat   ——>SimpleDateFormat

Format  ——>MessageFormat

              ——>NumberFormat——>ChoiceFormat

                                          ——> DecimalFormat用于格式化十进制数字

1.3.       DateFormat的用法

DateFormat 是日期/时间格式化子类的抽象类, 有一些static的get***Instance()方法来获得实例。通过设置结果的长度和地区,来获得日期,时间等的格式formatter。不太常用。

一般会使用SimpleDateFormat子类,newSimpleDateFormat("yyyy-MM-dd")或newSimpleDateFormat("yyyy-MM-dd HH:mm:ss"),来获得常用的时间格式。DateFormat 的get***Instance()方法一般也是获得SimpleDateFormat。

看DateFormat的源代码有个疑问,如果继承了DateFormat类,那DateFormat. get***Instance()的方法还是返回SimpleDateFormat? DateFormat.get是私有的,也不能覆盖。

DateFormat类中还有一些static的字段,如WEEK_OF_MONTH_FIELD,WEEK_OF_YEAR_FIELD。api上说在FieldPosition中使用,用于对齐。

java.util.Calendar也是日期操作相关的类,实现类为GregorianCalendar。主要对日期进行操作。注意add方法和roll方法的区别,roll方法不更改更大的字段。还有一些静态的变量DAY_OF_MONTH,DAY_OF_WEEK等,在get/set/add/roll方法中使用。

1.4.       MessageFormat的用法

和SimpleDateFormat一样,也需要传入一个pattern。如

String result = MessageFormat.format(

    "At {1,time} on {1,date}, there was {2} on planet{0,number,integer}.",

     7,new Date(), “ a message ”);

其中

{1,time}中1是指第几个参数,time是指格式化的类型。根据api进行设置,是调用NumberFormat和DateFormat进行格式化的。

还可以调用parse方法将字符串转化为Obejct。

1.5.       NumberFormat的用法

1.5.1.NumberFormat的介绍

NumberFormat 是所有数字格式的抽象基类。类结构与DateFormat类似。主要也是通过get***Instance方法获得实现类DecimalFormat。

比较常用的方法有:

setParseIntegerOnly:只影响分析。设为true,则忽略小数点以后的位置。

setDecimalSeparatorAlwaysShown:只影响格式化,且只影响小数点后没有数字的情况?设置分组符号是否显示。例如1,234中的,号是否显示。

setGroupingUsed:是否分组。如果此格式中使用了组,则返回 true。例如,在英国语言环境中,如果设置了组,则数 1234567 可能被格式化为 "1,234,567"。

还可以设置小数/整数部分的最大/小位数。

关于parse方法中的ParsePosition和 format方法中的FieldPosition待研究。

1.5.2. 子类DecimalFormat

DecimalFormat 是NumberFormat 的一个具体子类,用于格式化十进制数字。在DecimalFormat中传入pattern,可以自定义格式化类型。舍入方式是half-even(四舍五入)。

DecimalFormat 模式包含正数和负数子模式,例如 "#,##0.00;-#,##0.00"。;后面的代表负数模式。单独的 "0.00"等效于 "0.00;-0.00"。如果存在显式的负数子模式,则它仅指定负数前缀和后缀;

0:代表是数字;如果不存在则显示为0;

#:代表是数字;

,:分组分隔符;没有则不分组

1.5.3. 子类ChoiceFormat

ChoiceFormat通常用于在MessageFormat 中处理复数。创建 ChoiceFormat 时,可以指定一个 format 数组和一个limit 数组。这些数组的长度必须相同。

如api中用于转换星期的例子

 double[] limits = {1,2,3,4,5,6,7};

 String[] monthNames ={"Sun","Mon","Tue","Wed","Thur","Fri","Sat"};

 ChoiceFormat form = new ChoiceFormat(limits,monthNames);

 ParsePosition status = new ParsePosition(0);

 for (double i = 0.0; i <= 8.0; ++i) {

     status.setIndex(0);

     System.out.println(i + " -> "+ form.format(i) + " -> "

                              +form.parse(form.format(i),status));

 }

form.format(i)根据limits的数字转换为星期几的名称。limits中的数字必须按升序排列,如果提供的数字不在limits中,则选择使用第一个或最后一个索引。

form.parse(form.format(i),status),则根据Name转换为limits中的值。

1.5.4. ChoiceFormat的例子

下面是ChoiceFormat的api中一个较复杂的带模式格式的例子, 和MessageFormat一起使用:

 //生成ChoiceFormat

 double[] filelimits = {0,1,2};

 String[] filepart = {"are nofiles","is one file","are {2} files"};//这里的2是指从testArgs中取第二个元素的值

 ChoiceFormat fileform = newChoiceFormat(filelimits, filepart);

 

//定义Format数组testFormats,分别为ChoiceFormat,null,NumberFormat

//ChoiceFormat用于{0}, null用于{1},NumberFormat用于{2}

 Format[] testFormats = {fileform, null,NumberFormat.getInstance()};

 

//将MessageFormat的formats设为testFormats

//testFormats中的格式顺序对应于模式字符串中的格式元素的顺序

//最好使用setFormatsByArgumentIndex方法,而不是使用setFormats

 MessageFormat pattform = newMessageFormat("There {0} on {1}");

 pattform.setFormats(testFormats);

 

//进行fomat

 Object[] testArgs = {null, "ADisk",null};

 for (int i = 0; i < 4; ++i) {

     testArgs[0] = new Integer(i);

     testArgs[2] = testArgs[0];

//此时的testArgs值为{0, "ADisk",0}

//根据MessageFormat的定义,对testArgr元素进行处理

    System.out.println(pattform.format(testArgs));

 }

1.5.5. ChoiceFormat的pattern构造方法

ChoiceFormat还有另外一个构造方法,传入pattern。

为ChoiceFormat 对象指定一个模式是相当直接的。例如:

ChoiceFormat fmt= new ChoiceFormat(

      "-1#is negative| 0#is zero orfraction | 1#is one |1.0<is 1+ |2#is two |2<is more than 2.");

其中数字#是按照大小顺序排列的, formate方法中传入参数x,如果x在0,1之间,则按照0处理。

1.5.6. 其它的数字格式化

另外在对数字进行格式化时,也可以考虑使用java.math.BigDecimal。

如setScale(int newScale,int roundingMode):newScale指精确度,即保留几位小数。roundingMode指舍入模式,常用的是四舍五入。DecimalFormat貌似只能使用四舍五入,如果使用别的舍入方式,就要使用BigDecimal了。

java.lang.Integer中的几个转换进制的方法也比较实用

toBinaryString(int i): 以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。

toHexString(int i): 以十六进制的无符号整数形式返回一个整数参数的字符串表示形式

toOctalString(int i) :以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。

2.        java.util.Formatter

2.1.       介绍

Formatter类是个final的class,printf 风格的格式字符串的解释程序,和java.text.Format中的功能有很多重复的地方。

Formatter比较常见的使用方法是String.format(format,args),System.out.printf(format,args)等。这里只是简单总结一下,详细的参照api。下面的每节是对格式说明符中的元素的说明。

常规类型、字符类型和数值类型的格式说明符的语法如下:

%[argument_index$][flags][width][.precision]conversion

其中%和conversion(转换类型)是必须的,

%表示正则表达式的开始。

可选的argument_index$,指的是参数在参数列表中的位置。如果设定argument_index$,则按照args的顺序依次处理。

可选的 flags(标志) 是修改输出格式的字符集。有效标志的集合取决于转换类型

可选 width(宽度) 是一个非负十进制整数,表明要向输出中写入的最少字符数。

可选 precision(精度) 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。

2.2.       转换(conversion)

转换是核心,按参数类别可以分为常规,字符,整数,浮点,日期/时间,百分比,行分隔符。不区分大小写。

2.2.1. 常规

常规的返回值为字符串,有:

b:结果为“true/false”。参数 arg 为 null或boolean/Boolean型的false时,返回字符串的“false”。否则返回字符串的“true”。

h:结果为十六进制的字符串。如果参数 argnull,则结果为 "null"。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。

s:比较常用的转换,取得字符串。如果参数 arg 为 null,则结果为 "null"。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。

2.2.2.字符

c: 结果是一个 Unicode 字符

2.2.3.整数

是对进制的操作,有:

d:结果被格式化为十进制整数

o:结果被格式化为八进制整数

x:结果被格式化为十六进制整数

2.2.4.浮点

e:结果被格式化为用计算机科学记数法表示的十进制数

f :结果被格式化为十进制数

g:根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化

a:浮点  结果被格式化为带有效位数和指数的十六进制浮点数

2.2.5.日期/时间

t:日期和时间转换字符的前缀。对于日期/时间的转换,以t开头再指定转换内容。

如Calendar c = newGregorianCalendar(1995, MAY, 23);

   String s =String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);

具体参数的意义参照api。

2.2.6.百分比

%:结果为字面值 '%'。

2.2.7.行分隔符

n:生成一个换行符。为平台相关。

2.3.       标志(flags)

标志有'-','#','+','  ','0',',','('。常用的是'-':将结果设为左对齐。同时flag的使用依赖于conversion

2.4.       宽度(width)

宽度是将向输出中写入的最少字符数。对于行分隔符转换,不适用宽度,如果提供宽度,则会抛出异常。

2.5.       精度(.precision)

对于常规参数类型,精度是将向输出中写入的最多字符数。

对于浮点转换 'e'、'E' 和 'f',精度是小数点分隔符后的位数。

如果转换是 'g' 或 'G',那么精度是舍入计算后所得数值的所有位数。如果转换是 'a' 或 'A',则不必指定精度。

精度的优先级大于宽度。

3.        java.util.regex.Pattern

3.1.       介绍

Pattern(模式)是正则表达式的编译表示形式,经常和java.util.regex.Matcher。Pattern没有提供构造函数。通过调用Pattern. compile (String regex)方法来获得实例。pattern.matcher (CharSequence input);来判断是否input是否可以与regex匹配。compile

通过Matcher m = p.matcher("aaaaab");方法来获得Matcher。

pattern.split(CharSequence input);可以将input分隔成一个String数组。

3.2.       关于regex

字符类比较常用, []是对字符的罗列。如[abc]。[a-z&&[^bc]]    的解释为a 到 z,除了 b 和 c:[ad-z](减去)。

还有字符,预定义字符类,边界匹配器也比较常用。具体参照api。

Greedy 数量词也需要了解。

X? 表示X,一次或一次也没有

X* 表示X,零次或多次

X+ 表示X,一次或多次

X{n} 表示X,恰好 n 次  

X{n,} 表示 X,至少 n 次

X{n,m} 表示X,至少 n 次,但是不超过 m 次。

Greedy 数量词,这种匹配原则就叫作"贪婪" 模式。总是尽可能多的匹配符合它规则的字符。

Reluctant 数量词,Possessive 数量词不晓得有啥区别。

组和捕获:捕获组可以通过从左到右计算其开括号来编号。如(ca)(t)。

3.3.       Matcher(匹配器)

通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:

matches 方法尝试将整个输入序列与该模式匹配。 注意是整个输入字符串。

lookingAt 尝试将输入序列从头开始与该模式匹配。

find 方法扫描输入序列以查找与该模式匹配的下一个子序列。

方法:

matcher.appendReplacement(StringBuffersb, String replacement):实现非终端追加和替换步骤。就是将模式匹配到的字符串,替换为replacement,并将区域加入到sb中。区域的操作,参看match.region,match. regionStart, match.regionEnd。

matcher.appendTail(StringBuffersb) 实现终端追加和替换步骤。可以在一次或多次调用appendReplacement 方法后调用它来复制剩余的输入序列。Tail的意思尾部,也就是剩余的意思。这里的终端应该就是指尾部。

matcher.replaceAll(Stringreplacement):替换模式与给定替换字符串相匹配的输入序列的每个子序列。比较方便的方法,用replacement直接替换掉与模式匹配的字符串。

与模式中的组和捕获相关的方法,有match.group,match.groupCount。如模式(ca)(t)的groupCount就是2。


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值