一、简介
——在java.text包中
——作用:对数据格式化输出
——java对文字,数字的格式化,是有一个公共的父类的Format。
①NumberFormat和DecimalFormat都是它的子类关于数字的
②DateFormat和SimpleDateFormat也是它的子类关于文字的
当然今天只说NumberFormat和DecimalFormat。相信我,当你搞懂这两个以后,那么DateFormat和SimpleDateFormat也是肯定会的。
首先,要特别注意的是 NumberFormat和DecimalFormat是线程不安全的。 这意味你如果同时有多个线程操作一个format实例对象,会出现意想不到的结果。
解决方法有两个:
1、为每个线程都创建一个 format实例,通过ThreadLocal 来给每个线程都产生一个本地实例。
2、进行外部同步,这个就可以通过关键词 synchronized来进行同步
上面的这两种方法呢,
第一种方法 比较占用内存多,但是速度快,效率高。并发。第二种方法 占用内存少,效率低,耗费时间长,毕竟要排队嘛,串行。具体取舍,看项目的情况。
——DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。
——在别的文章中我们讲了包的导入有两种方式,使用import语句以及直接指明含该类的包。当我们只需要格式一个或较少数据时,可以用第二种方式。数据较多时,用第一种。
二、代码演示
class Chapter_02_Son {
//学生信息类
String name;
int ID;
int classId;
//重写构造方法,初始化类成员变量
Chapter_02_Son(){
this("", 0, 0);
}
Chapter_02_Son(String name, int ID,int classId ){
= name;
this.ID = ID;
this.classId = classId;
}
//重写toString(),格式化输出学生信息,没有导入包java.text,直接在程序中指明含类的包
public String toString() {
return "name: " + name +
" ID: " + new java.text.DecimalFormat("00000").format(ID) +
" classId: " + new java.text.DecimalFormat("00").format(classId) ;
}public static void main(String[] args) {
Chapter_02_Son student1;
student1 = new Chapter_02_Son("zhangsan", 20212, 5);
System.out.println(student1.toString());
}输出结果:
name: zhangsan ID: 20212 classId: 05
我们给classId的值是5,输出时是05,说明按照我们重写的toString()的格式输出了。
三、格式符号

四、常见格式化方式
我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子。下面是一个例子:
importjava.text.DecimalFormat;
publicclassTestNumberFormat{
public static void main(String[]args){
double pi=3.1415927;
//取一位正数
System.out.println(new DecimalFormat("0").format(pi));
//取一位整数,两位小数
System.out.println(new DecimalFormat("0.00").format(pi));
//取两位整数,三位小数,整数不足部分以0补足
System.out.println(new DecimalFormat("00.000").format(pi));
//取所有整数部分
System.out.println(new DecimalFormat("#").format(pi));
//以百分比方式计数,并取两位小数
System.out.println(new DecimalFormat("#.##%").format(pi));
long c=299792458;//光速
//显示为科学计数法,并取五位小数
System.out.println(new DecimalFormat("#.#####E0").format(c));
//显示为两位整数的科学计数法,并取四位小数
System.out.println(new DecimalFormat("00.####E0").format(c));
//每三位以逗号进行分隔
System.out.println(new DecimalFormat(",###").format(c));
//将格式嵌入文本
System.out.println(new DecimalFormat("光速大小为每秒,###米").format(c));
}输出结果:
3
3.14
03.142
3
314.16%
2.99792E8
29.9792E7
299,792,458
光速大小为每秒299,792,458米
















