格式化输出的实用指南
在 Java 中,占位符是格式化字符串输出的利器,让动态生成文本变得简单而优雅。无论是控制台输出、日志记录还是生成报告,掌握这些占位符都能让你的代码更加简洁专业。
---------------------------------------------------------------------------------------------------------------------------------
1. 字符串占位符
| 占位符 | 说明 | 示例 | 输出 |
|---|
%s | 字符串 | String.format("Hello, %s!", "World") | Hello, World! |
%c | Unicode 字符 | String.format("First character: %c", 'A') | First character: A |
2. 数值占位符
| 占位符 | 说明 | 示例 | 输出 |
|---|
%d | 十进制整数 | String.format("Age: %d", 25) | Age: 25 |
%x | 十六进制整数 | String.format("Hex: %x", 255) | Hex: ff |
%o | 八进制整数 | String.format("Octal: %o", 10) | Octal: 12 |
%f | 浮点数 | String.format("Price: %.2f", 5999.99) | Price: 5999.99 |
%e | 科学计数法 | String.format("Scientific: %e", 5999.99) | Scientific: 5.999990e+03 |
%a | 十六进制浮点数 | String.format("Hex float: %a", 5999.99) | Hex float: 0x1.7700000000000p+12 |
3. 格式化修饰符
| 修饰符 | 说明 | 示例 | 输出 |
|---|
%, | 千位分隔符 | String.format("Price: ¥%,.2f", 5999.99) | Price: ¥5,999.99 |
%.2f | 保留两位小数 | String.format("Price: %.2f", 5999.99) | Price: 5999.99 |
%05d | 5位数字,不足补0 | String.format("ID: %05d", 25) | ID: 00025 |
%-10s | 左对齐,10字符宽度 | String.format("Name: %-10s", "John") | Name: John |
%+d | 正数前加+号 | String.format("Value: %+d", 25) | Value: +25 |
4. 特殊占位符
| 占位符 | 说明 | 示例 | 输出 |
|---|
%n | 换行符 | String.format("Hello%nWorld") | Hello<br>World |
%b | 布尔值 | String.format("Valid: %b", true) | Valid: true |
二、实战示例
1. 商品信息格式化(你提供的示例)
pw.printf("商品:%s,价格:¥%,.2f,库存:%d%n", "笔记本电脑", 5999.99, 100); // 输出:商品:笔记本电脑,价格:¥5,999.99,库存:100
2. 日志格式化(常见场景)
logger.info("用户 {} 登录成功,IP: {}, 时间: {}", "张三", "192.168.1.1", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // 输出:用户 张三 登录成功,IP: 192.168.1.1, 时间: 2023-10-25 14:30:45
3. 日期和时间格式化
String dateStr = String.format("今天是 %tF (星期%tA),时间是 %tT", new Date(), new Date(), new Date()); // 输出:今天是 2023-10-25 (星期三),时间是 14:30:45
4. 金额格式化(带货币符号)
String amount = String.format("总金额: ¥%,.2f (人民币)", 123456.78); // 输出:总金额: ¥123,456.78 (人民币)
5. 生成报表
System.out.printf("%-15s | %-10s | %-8s%n", "产品", "价格", "库存"); System.out.printf("%-15s | ¥%,.2f | %-8d%n", "笔记本电脑", 5999.99, 100); System.out.printf("%-15s | ¥%,.2f | %-8d%n", "智能手机", 3999.00, 250); // 输出: // 产品 | 价格 | 库存 // 笔记本电脑 | ¥5,999.99 | 100 // 智能手机 | ¥3,999.00 | 250
三、占位符的高级用法
1. 动态格式化
1int precision = 2; 2String formatted = String.format("Price: %." + precision + "f", 5999.99); 3// 输出:Price: 5999.99
2. 与MessageFormat结合使用
1String pattern = "用户 {0} 在 {1} 登录,IP: {2}"; 2String message = MessageFormat.format(pattern, "张三", new Date(), "192.168.1.1"); 3// 输出:用户 张三 在 Wed Oct 25 14:30:45 CST 2023 登录,IP: 192.168.1.1
3. 生成带格式的文本文件
1try (PrintWriter writer = new PrintWriter("report.txt")) { 2 writer.printf("%-20s | %-10s | %-10s%n", "Product", "Price", "Stock"); 3 writer.printf("%-20s | ¥%,.2f | %-10d%n", "Laptop", 1299.99, 50); 4 writer.printf("%-20s | ¥%,.2f | %-10d%n", "Smartphone", 699.50, 120); 5}