在java中数字和日期的格式化功能并没有结合在输出\输入功能上。通常对用户显示的数字是通过GUI来完成的。你会把String放在可滚动的数字区域块或者表格中。如果格式化功能只有在绑定在文本模式的输出命令上,那就没有办法将字符串以比较漂亮的格式输出到GUI上。在java 5.0之前的格式化功能是通过java.text这个包来处理,但是现在不屑于提到它。
从java5.0起,更多更友好更有拓展性的功能是通过java.util中的Formatter这个类来提供的。但是你不需要自己创建和调用这个class上的方法,因为java 5.0已经把便利的功能加到部分的输入、输出类和String上了。因此,只需要调用静态的String.format()并传入值和格式设定就好。
public class TestFormats {
public static void main(String[] args) {
String s = String.format("%,d", 1000000000);
System.out.println(s);
}
}
运行结果:1,000,000,000
以上程序中的"%,d"就是格式设定,用来指示应该用哪种形式来输出;这里的逗号是表示数字要用逗号来分开,并不是说这里有%与d这两个参数,千万不要弄错了。
%代表将参数放在这里
当你看到%的时候,要把它想作是会被方法其余参数替换掉的位置。PS:和C和C++中很像。
String s = String.format("I have %.2f bugs to fix.", 476578.09867);
运行结果:I have 476578.10 bugs to fix.【保留两位小数】
如果将格式字符串变为下面的:
String s = String.format("I have %,.2f bugs to fix.", 476578.09867);
那么运行结果将会是:I have 476,578.10 bugs to fix.【输出结果中带有千位分隔符】
格式化语句有自己的一套语法
%符号后面不可以随便填上任意的字符。%语法有着非常特殊的规则,是用来描述此处所用的格式。
例如:%,d:十进制整数以千位分隔符的方式进行显式
%.2f:保留2位小数
%,.2f:整数部分使用千位分隔符,小数部分保留2位小数
跟在百分号后面(包括类型指示,如:d或者f)的每一个东西都是格式化指令。除非遇到新的百分号,在类型指示之后的一组字符,格式化程序会假设都是直接输出的字符串。
日期格式化:
完整的日期日期和时间:%tc
String s = String.format("%tc", new Date());
输出:星期五 一月 02 17:23:29 CST 2015
只有时间:%tr
String s = String.format("%tr", new Date());
输出:05:24:16 下午
周、月、日:%tA、%tB、%td
Date today = new Date();
String s = String.format("%tA,%tB,%td", today,today,today);
输出:星期五,一月,02【这样就需要传入today3次】
同上,但是不用重复给出参数:
Date today = new Date();
String s = String.format("%tA,%<tB,%<td", today);
“<”这个符号是个特殊的指示,用来告诉格式化程序重复利用之前使用过的参数。
取得当前的日期使用Date,其余的功能可以从Calendar上找。
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(2008, 1, 20, 23, 36, 25); // 设定时间为2008-02-20 23:36:25
System.out.println(calendar.getTime());
long day = calendar.getTimeInMillis(); // 以毫秒显示当前日期
System.out.println("以毫秒显示日期:" + day);
day -= 60 * 60 * 1000; // 将时间落后1小时
calendar.setTimeInMillis(day); // 以毫秒的方式设置日期
System.out.println("1小时前的时间:" + calendar.getTime());
System.out.println("小时:" + calendar.get(Calendar.HOUR_OF_DAY));
calendar.add(Calendar.MONTH, -60); // 前60个月
System.out.println("60个月之前的时间:" + calendar.getTime());
calendar.roll(calendar.DATE, 55);
System.out.println("滚动55天:" + calendar.getTime()); // 还是在本月份内部,就类似于溢出问题
calendar.set(calendar.DATE, 15);
System.out.println("直接设置日期为15号:" + calendar.getTime());
}
}
运行结果:
Wed Feb 20 23:36:25 CST 2008
以毫秒显示日期:1203521785117
1小时前的时间:Wed Feb 20 22:36:25 CST 2008
小时:22
60个月之前的时间:Thu Feb 20 22:36:25 CST 2003
滚动55天:Wed Feb 19 22:36:25 CST 2003
直接设置日期为15号Sat Feb 15 22:36:25 CST 2003
以毫秒显示日期:1203521785117
1小时前的时间:Wed Feb 20 22:36:25 CST 2008
小时:22
60个月之前的时间:Thu Feb 20 22:36:25 CST 2003
滚动55天:Wed Feb 19 22:36:25 CST 2003
直接设置日期为15号Sat Feb 15 22:36:25 CST 2003
其中要注意一点:Calendar的roll(Calendar.DATE,32)方法改变的只是日期,加入当前是1月30日,那么roll(Calendar.DATE,2)将得到1月1日(而不是2月1日),这就是与add()方法的区别。