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 → 四位年份(如2025)%tm → 两位月份(01–12)%td → 两位日期(01–31)%tH → 24小时制小时(00–23)%tM → 分钟(00–59)%tS → 秒(00–60,支持闰秒)%tp → 上午/下午(am/pm)示例:
Formatter fmt = new Formatter();
数字格式化通过d(十进制整数)、f(浮点数)、x(十六进制)、e(科学计数法)等转换符实现。关键参数包括宽度(最小字符数)和精度(小数位数或最大字符串长度):
%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()替代DateTimeFormatter处理日期、NumberFormat或String.format()处理数字,语义更清晰、API更现代String.format()底层就是基于Formatter,日常开发中更简洁:String s = String.format("订单号:%08d,时间:%tF %tR", 123, new Date());
不必硬套Formatter。实际选择看需求:
String.format()最轻量DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault())
NumberFormat.getCurrencyInstance()或getPercentInstance()
Formatter到ThreadLocal,但通常没必要基本上就这些。Formatter是基础工具,理解它有助于读懂老代码,但新项目优先考虑更直观、更安全的现代API。