在Java中如何使用Formatter格式化日期与数字_Java格式工具综合使用说明

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

Java中使用Formatter格式化日期与数字,核心在于掌握其占位符语法和参数类型匹配规则。它比简单拼接更安全,比SimpleDateFormatNumberFormat更统一,但需注意线程不安全、类型强校验等细节。

日期格式化:用trtD等时间转换符

Formatter本身不直接解析日期对象,而是配合java.util.DateCalendar或Java 8+的TemporalAccessor(需转为InstantLocalDateTime再适配)使用。常用时间转换符有:

  • %tY → 四位年份(如2025)
  • %tm → 两位月份(01–12)
  • %td → 两位日期(01–31)
  • %tH → 24小时制小时(00–23)
  • %tM → 分钟(00–59)
  • %tS → 秒(00–60,支持闰秒)
  • %tp → 上午/下午(am/pm)

示例:

Formatter fmt = new For

matter();
fmt.format("今天是:%tY年%tm月%td日 %tH:%tM", new Date(), new Date(), new Date(), new Date(), new Date());
// 输出类似:今天是:2025年07月15日 14:28

数字格式化:控制宽度、精度与进制

数字格式化通过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(如用%ddouble
  • Formatter不是线程安全的,多线程中建议每次新建或使用String.format()替代
  • Java 8+推荐优先使用DateTimeFormatter处理日期、NumberFormatString.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。