Java中Formatter格式化需掌握占位符语法与类型匹配规则,日期用%t系列转换符(如%tY、%tm),数字用%d、%f等并支持宽度精度控制;注意线程不安全,新项目优先用DateTimeFormatter和NumberFormat。

Java中使用Formatter格式化日期与数字,核心在于掌握其占位符语法和参数类型匹配规则。它比简单拼接更安全,比SimpleDateFormat或NumberFormat更统一,但需注意线程不安全、类型强校验等细节。
日期格式化:用tr、tD等时间转换符
Formatter本身不直接解析日期对象,而是配合java.util.Date、Calendar或Java 8+的TemporalAccessor(需转为Instant或LocalDateTime再适配)使用。常用时间转换符有:
-
%tY→ 四位年份(如2024) -
%tm→ 两位月份(01–12) -
%td→ 两位日期(01–31) -
%tH→ 24小时制小时(00–23) -
%tM→ 分钟(00–59) -
%tS→ 秒(00–60,支持闰秒) -
%tp→ 上午/下午(am/pm)
示例:
Formatter fmt = new Formatter();fmt.format("今天是:%tY年%tm月%td日 %tH:%tM", new Date(), new Date(), new Date(), new Date(), new Date());
// 输出类似:今天是:2024年07月15日 14:28
数字格式化:控制宽度、精度与进制
数字格式化通过d(十进制整数)、f(浮点数)、x(十六进制)、e(科学计数法)等转换符实现。关键参数包括宽度(最小字符数)和精度(小数位数或最大字符串长度):
立即学习“Java免费学习笔记(深入)”;
-
%d→ 普通整数:fmt.format("数量:%d", 123)→ “数量:123” -
%05d→ 补零对齐:fmt.format("编号:%05d", 7)→ “编号:00007” -
%.2f→ 保留两位小数:fmt.format("价格:%.2f元", 99.9)→ “价格:99.90元” -
%,d→ 千分位分隔:fmt.format("金额:%,d", 1000000)→ “金额:1,000,000” -
%x→ 小写十六进制:fmt.format("颜色:%x", 255)→ “颜色:ff”
组合使用与注意事项
一个Formatter实例可连续调用format(),参数按顺序填入;也可用%n换行、%%输出百分号。但要注意:
- 参数类型必须匹配转换符,否则抛
IllegalFormatConversionException(如用%d传double) -
Formatter不是线程安全的,多线程中建议每次新建或使用String.format()替代 - Java 8+推荐优先使用
DateTimeFormatter处理日期、NumberFormat或String.format()处理数字,语义更清晰、API更现代 -
String.format()底层就是基于Formatter,日常开发中更简洁:String s = String.format("订单号:%08d,时间:%tF %tR", 123, new Date());
替代方案对比:什么场景选什么
不必硬套Formatter。实际选择看需求:
- 简单日志/提示拼接 → 直接用
String.format()最轻量 - 复杂日期逻辑(时区、本地化、ISO格式)→ 用
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()) - 货币/百分比/科学计数等本地化格式 → 用
NumberFormat.getCurrencyInstance()或getPercentInstance() - 需要复用同一格式多次且线程隔离 → 可封装
Formatter到ThreadLocal,但通常没必要
基本上就这些。Formatter是基础工具,理解它有助于读懂老代码,但新项目优先考虑更直观、更安全的现代API。










