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。

另外的format和parseObject这两个方法的重载。

方法formatToCharacterIterator(Object obj)并非抽象方法,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子类,new SimpleDateFormat(“yyyy-MM-dd”)或new SimpleDateFormat(“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 no files”,”is one file”,”are {2} files”};//这里的2是指从testArgs中取第二个元素的值

ChoiceFormat fileform = new ChoiceFormat(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 = new MessageFormat(“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 or fraction | 1#is one |1.0

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 10:49:14

java.text.Format体系总结的相关文章

java.text.Format及相关类详解

java.text.Format Format是一个用于格式化语言环境敏感的信息(如日期.消息和数字)的抽象基类,直接已知子类有DateFormat, MessageFormat, NumberFormat. Format定义了编程接口,用于将语言环境敏感的对象格式化为String(使用format方法)和将String重新解析为对象(使用 parseObject方法). 通常,一个Format的parseObject方法必须能解析任何由其Format方法格式化的字符串.不过,也可能存在不能解析

【java】Date与String之间的转换:java.text.SimpleDateFormat、public Date parse(String source) throws ParseException和public final String format(Date date)

1 package 日期日历类; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 public class TestDate { 8 public static void main(String[] args) { 9 Date date=new java.util.Date(); 10 System.out.println(date);/

fastjson反序列化LocalDateTime失败的问题java.time.format.DateTimeParseException: Text &#39;2019-05-24 13:52:11&#39; could not be parsed at index 10

本地java类 import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; /*** * 问题处理记录 */ public class UserIssueProcessDto { /*** * 处理说明 */ private String f_clsm; /*** * 施工队处理反馈 */ private String f_fk; /*** * 处理开始时间 */ @Da

java.text.NumberFormat

NumberFormat 是所有数值格式的抽象基类.此类提供格式化和解析数值的接口.NumberFormat 还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么. NumberFormat 可用于格式化和解析任何语言环境的数值.使代码能够完全独立于小数点.千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关. 若要格式化当前 Locale 的数值,可使用其中一个工厂类方法: myString = NumberFormat.getInstance().for

java.text.NumberFormat使用方法

NumberFormat 是全部数值格式的抽象基类. 该类提供了格式化和分析数值的接口. NumberFormat 也提供了确定 哪个语言环境具有数值格式以及它们名字的方法. package com.discursive.jccook.collections; import java.text.NumberFormat; public class Test { /** * @param args */ public static void main(String[] args) { // TOD

java.text.MessageFormat

java.text.MessageFormat MessageFormat provides a means to produce concatenated messages in a language-neutral way. Use this to construct messages displayed for end users. MessageFormat takes a set of objects, formats them, then inserts the formatted

由Double类型数据到数据的格式化包java.text

需求:Double类型数据截取操作保留两位小数 解决方案: 1 java.text.DecimalFormat df =new java.text.DecimalFormat("#.00"); 2 df.format(你要格式化的数字); 也可写成一句: 1 new java.text.DecimalFormat("#.00").format(你要格式化的数字); 引申:java.text包:提供以与自然语言无关的方式来处理文本.日期.数字和消息的类和接口. jav

java.text.ParseException: Unparseable date: &quot;Mon Mar 30 00:00:00 CST 2015&quot;

解决方案: package config; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test { public static void main(String[] args) { String s="Mon Mar 30 00:00:00 CST 2015"; D

Java date format 时间格式化

import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL = 0 * DateFormat.DEFAULT = 2 * DateFormat.LONG = 1 * DateFormat.MEDIUM = 2 * DateFormat.SHORT = 3 * @author    Michael * @version   1.0, 2007/03/09 */ public class Tes