HeadFirstJava学习——数字和日期格式化

在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)的每一个东西都是格式化指令。除非遇到新的百分号,在类型指示之后的一组字符,格式化程序会假设都是直接输出的字符串。

格式化说明最多会有5个部分(不包括%)。下面的[]符号里面的都是选择性的项目,因此只有%与type是必要的。格式化说明的顺序是有规定的,必须要以这个顺序来指定。

日期格式化:

完整的日期日期和时间:%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
其中要注意一点:Calendar的roll(Calendar.DATE,32)方法改变的只是日期,加入当前是1月30日,那么roll(Calendar.DATE,2)将得到1月1日(而不是2月1日),这就是与add()方法的区别。








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值