从上面的结构图可以看出来,Format类是最根本的父类;
一、Format
源码可以看到对这个类的说明:
Format is an abstract base class for formatting locale-sensitive information such as dates, messages, and numbers.
Format是一个抽象基类,用于格式化区域设置敏感信息,如日期、消息和数字
Format其具体子类必须实现两个抽象方法
- format(Object obj, StringBuffer toAppendTo, FieldPosition pos) 用于将对象格式化为指定模式的字符串
- parseObject(String source, ParsePosition pos) 用于将字符串重新解析为对象
Format的直接子类包括DateFormat、NumberFormat和MessageFormat。
通过ctrl+h查看Format的继承关系
二、DateFormat
DateFormat根据当前语言环境格式化日期和时间。
DateFormat是一个抽象类,所以不能直接new创建实例对象。但该类为我们提供了工厂方法( public final static 修饰的方法)方便我们使用。
-
getDateInstance()方法,获取格式化的日期,输出样式:2015-12-10
-
getDateTimeInstance()方法,获取格式化的日期和时间,输出样式:2015-12-10
10:21:41
-
getTimeInstance()方法,获取格式化的时间,输出样式:10:21:41
-
getInstance()方法,获取格式化的日期和时间,输出样式:15-12-10
2.1 SimpleDateFormat
SimpleDateFormat是DateFormat的一个具体类,它允许我们指定格式模式从而获取我们理想的格式化日期和时间。
通过SimpleDateFormat的构造方法你可以传入一个格式模式字符串或者通过applyPattern(String pattern)方法添加一个格式模式字符串。
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("今天是yyyy-MM-dd E hh:mm:ss,是yyyy年的第DD天,在该月是第dd天");
System.out.println(format.format(date));
将会输出:今天是2015-12-10 星期四 09:38:16,是2015年的第344天,在该月是第10天
三、NumberFormat
NumberFormat根据当前语言环境格式化数字;
NumberFormat同样是一个抽象基类,可以使用API中的工厂方法获取实例对象:
- getCurrencyInstance()方法,根据当前语言环境获取货币数值格式。传递Locale对象可以获取指定语言环境下的货币数值格式,比如
NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CANADA);
System.out.println(format.format(439.6));
将会输出:$439.60
-
getInstance()和getNumberInstance()方法都会获取到常规数值格式
-
getIntegerInstance()方法获取常规整数值格式,如果需要格式化的数值为小数,则会将数值四舍五入为最接近的整数
-
getPercentInstance()方法获取百分比的数值格式
NumberFormat有两个具体实现子类DecimalFormat和ChoiceFormat
3.1 DecimalFormat
DecimalFormat同SimpleDateFormat类似,允许我们指定格式模式获取我们想要的格式化数值
DecimalFormat类对于数值的小数部分,默认显示3位小数,在去掉超出小数点后面3位的部分时,会将数值四舍五入为最接近的数值格式化输出。淡然我们可以对这个默认进行设置
setMaximumFractionDigits(int newValue)方法,设置小数部分中允许的最大数字位数
setMinimumFractionDigits(int newValue)方法,设置小数部分中允许的最小数字位数,如果原数小数位数不够的话,会补零。
对于数值的整数部分,默认3个数字为一组进行显示,同样对此我们也可以自定义;
-
setGroupingSize(int i)方法,设置分组中一组的位数。
-
setGroupingUsed(boolean value)方法设置是否使用分组,true表示使用,false表示取消分组
-
setMaximumIntegerDigits(int newValue)方法设置整数部分允许的最大数字位数
-
setMinimumIntegerDigits(int newValue)方法设置整数部分允许的最小数字位数
格式模式元素
0 表示一个数字,被格式化数值不够的位数会补0
# 表示一个数字,被格式化数值不够的位数会忽略
. 小数点分隔符的占位符
, 分组分隔符的占位符
- 缺省负数前缀
% 将数值乘以100并显示为百分数
\u2030 将数值乘以1000并显示为千分数
例子:
DecimalFormat format1 = new DecimalFormat("#\u2030");
System.out.println(format1.format(0.3345));//输出334%。
DecimalFormat format2 = new DecimalFormat("##.##");
System.out.println(format2.format(12.3)); // 12.3
DecimalFormat format3 = new DecimalFormat("0000.00");
System.out.println(format3.format(12.3)); //12.30
DecimalFormat format4 = new DecimalFormat("#.##%");
System.out.println(format4.format(12.345)); // 1234.5%
四、MessageFormat
MessageFormat提供了以语言环境无关的生成连接消息的方式。
常用MessageFormat的静态方法format,该方法接收一个字符串的模式和一组对象(对象数组),按照模式形式将格式化的对象插入到模式中,然后返回字符串结果。
-
setFormatByArgumentIndex(int argumentIndex, Format newFormat)//
-
setFormats(Format[] newFormats)
-
setFormat(int formatElementIndex, Format newFormat)
MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
double[] filelimits = { 0, 1, 2 };
String[] filepart = { "no files", "one file", "{0,number} files" };
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
form.setFormatByArgumentIndex(0, fileform);
int fileCount = 1273;
String diskName = "MyDisk";
Object[] testArgs = { new Long(fileCount), diskName };
System.out.println(form.format(testArgs));
//输出:The disk "MyDisk" contains 1,273 files.
五、String类中的format方法
String类中的format方法 https://blog.csdn.net/LC_Liangchao/article/details/121794093