String.format()
、System.out.printf()
或Formatter
类实现,支持数字、日期和字符串的格式化输出,常用占位符如%d
(整数)、%.2f
(两位小数)和%s
(字符串),结合SimpleDateFormat
可处理日期时间格式。在Java开发中,格式化操作是处理数据展示的核心需求,涉及数字、日期、字符串等类型的标准化输出,以下详细解析Java格式化的实现方法,涵盖主流API及最佳实践,确保代码可读性和国际化兼容性。
字符串格式化:String.format()
与 System.out.printf()
原理:基于格式说明符(%s
、%d
等)动态生成字符串。
// 基础用法 String name = "Alice"; int age = 30; String formatted = String.format("姓名: %s, 年龄: %d", name, age); // 结果:"姓名: Alice, 年龄: 30" // 控制小数位数 double price = 99.987; System.out.printf("价格: %.2f 元", price); // 输出:价格: 99.99 元
格式符详解:
%s
:字符串%d
:整数%f
:浮点数(.2f
表示保留两位小数)%t
:日期时间(需配合T
使用,如%tY
表示四位年份)
数字格式化:DecimalFormat
类
适用场景:精确控制数字的千分位、小数位、货币符号等。
import java.text.DecimalFormat; double value = 12345.6789; // 千分位分隔 + 保留两位小数 DecimalFormat df1 = new DecimalFormat("#,##0.00"); System.out.println(df1.format(value)); // 输出:12,345.68 // 货币格式化(自动适配本地化) DecimalFormat df2 = new DecimalFormat("¤#,##0.00"); df2.setCurrency(Currency.getInstance("USD")); System.out.println(df2.format(value)); // 输出:$12,345.68
模式符号:
- :可选数字位
0
:强制补零位- :千分位分隔符
- :货币符号占位符
日期时间格式化
1 传统方案:SimpleDateFormat
(Java 8之前)
import java.text.SimpleDateFormat; import java.util.Date; Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(now)); // 输出:2025-10-05 14:30:45
注意:SimpleDateFormat
非线程安全,多线程需配合ThreadLocal
使用。
2 现代方案:DateTimeFormatter
(Java 8+推荐)
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); System.out.println(now.format(formatter)); // 输出:2025/10/05 14:30
优势:线程安全、支持ISO标准格式(如DateTimeFormatter.ISO_DATE
)。
复杂文本格式化:MessageFormat
适用场景:动态拼接含占位符的字符串(支持复数、条件判断等)。
import java.text.MessageFormat; String pattern = "用户{0}购买了{1}件商品,总计{2,number,currency}"; Object[] args = {"Alice", 3, 299.97}; String result = MessageFormat.format(pattern, args); // 输出:用户Alice购买了3件商品,总计¥299.97
高级特性:
{index, type, style}
:指定数据类型和样式- 支持复数规则:
{1,choice,0#无商品|1#一件商品|1<{1}件商品}
格式化最佳实践
- 国际化优先:
- 使用
NumberFormat.getCurrencyInstance(Locale.US)
适配本地货币 DateTimeFormatter
自动兼容时区转换
- 使用
- 性能优化:
- 避免在循环中重复创建
DecimalFormat
或SimpleDateFormat
- 使用预定义的格式常量(如
DateTimeFormatter.ISO_DATE
)
- 避免在循环中重复创建
- 异常处理:
- 捕获
ParseException
(解析时)或IllegalArgumentException
(格式错误)
- 捕获
场景 | 推荐API | 关键优势 |
---|---|---|
简单字符串拼接 | String.format() |
语法简洁,类似C语言printf |
数字精确控制 | DecimalFormat |
支持自定义模式与货币格式化 |
日期处理(Java 8+) | DateTimeFormatter |
线程安全,兼容ISO标准 |
动态文本模板 | MessageFormat |
支持复数、条件等复杂逻辑 |
引用说明: 基于Oracle官方文档Java SE Formatting及《Effective Java》第三版(Joshua Bloch著),日期时间API遵循ISO 8601标准,货币格式化参考
java.util.Currency
规范。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/34593.html