Java 字符串格式化
一、方式 1:String.format(String format, Object... args)
✔ 核心特点
- Java 最通用、最高频的格式化方式,没有之一
- 语法继承自 C 语言 printf,通用性极强,所有 Java 版本兼容
- 返回值是格式化后的字符串,可以赋值给变量、存储、传输、打印,灵活度拉满
- 语法:
String.format(格式化模板, 参数1, 参数2, ...)- 格式化模板:包含占位符和固定文本
- 参数列表:按顺序填充占位符的动态值,参数个数和占位符个数必须匹配
✔ 最常用「占位符」(必背,99% 开发够用)
占位符格式:
%[修饰符]类型码,核心记住基础类型码即可,修饰符是锦上添花,所有占位符均以 % 开头,大小写敏感。%s :格式化「字符串」,最常用!可以接收任意类型数据(Java会自动转为字符串)
%d :格式化「整数」(byte/short/int/long),只接收数字类型
%f :格式化「浮点型」(float/double),只接收小数类型
%c :格式化「单个字符」char
%b :格式化「布尔值」boolean,输入任意值都会转为 true/false
%% :格式化「百分号本身」,转义作用(因为%是占位符关键字,不能直接写)
✔ 基础使用实例(入门必看,直接运行)
public class StringFormatDemo {
public static void main(String[] args) {
// 1. 格式化字符串 + 整数 + 浮点
String name = "张三";
int age = 28;
double salary = 20000.5678;
String str1 = String.format("姓名:%s,年龄:%d,月薪:%f", name, age, salary);
System.out.println(str1); // 输出:姓名:张三,年龄:28,月薪:20000.567800
// 2. 格式化字符 + 布尔值 + 百分号
char sex = '男';
boolean isMarry = false;
String str2 = String.format("性别:%c,已婚:%b,提成比例:%d%%", sex, isMarry, 15);
System.out.println(str2); // 输出:性别:男,已婚:false,提成比例:15%
// 3. %s 万能占位符:接收任意类型
String str3 = String.format("任意类型1:%s,任意类型2:%s,任意类型3:%s", true, 100, 3.14);
System.out.println(str3); // 输出:任意类型1:true,任意类型2:100,任意类型3:3.14
}
}
✔ 进阶常用格式化规则(开发高频,重点掌握)
针对数字和浮点型的格式化,我们经常需要「保留小数、补 0 对齐、指定长度」,这些都是工作中每天会用到的,直接复制套用即可
1. 浮点型格式化(重中之重):保留指定小数位、四舍五入
double num = 3.1415926;
// %.2f 保留2位小数,%.3f保留3位小数,默认四舍五入(Java核心规则)
String f1 = String.format("保留2位小数:%.2f", num);
String f2 = String.format("保留3位小数:%.3f", num);
String f3 = String.format("默认保留6位小数:%f", num);
System.out.println(f1); // 保留2位小数:3.14
System.out.println(f2); // 保留3位小数:3.142
System.out.println(f3); // 默认保留6位小数:3.141593
2. 整数格式化:补 0 对齐、指定长度
int num1 = 8;
int num2 = 123;
// %03d :总长度3位,数字不足时左侧补0;%05d 总长度5位,左侧补0
String d1 = String.format("补0到3位:%03d", num1);
String d2 = String.format("补0到5位:%05d", num1);
String d3 = String.format("指定长度(超长不影响):%03d", num2);
System.out.println(d1); // 补0到3位:008
System.out.println(d2); // 补0到5位:00008
System.out.println(d3); // 指定长度(超长不影响):123
3. 字符串 / 数字对齐:左对齐、右对齐
String s = "Java";
int n = 66;
// %8s :总长度8位,字符串右对齐(默认);%-8s :总长度8位,字符串左对齐
String align1 = String.format("字符串右对齐:%8s", s);
String align2 = String.format("字符串左对齐:%-8s", s);
String align3 = String.format("数字左对齐:%-6d", n);
System.out.println(align1); // 输出: Java
System.out.println(align2); // 输出:Java
System.out.println(align3); // 输出:66
二、方式 2:System.out.printf(String format, Object... args)
✔ 核心特点
- 语法和 String.format 完全一模一样,占位符、修饰符通用,不用重新记!
- 区别:
printf是 直接将格式化后的内容输出到控制台,没有返回值;String.format是返回格式化后的字符串,不会自动打印。 - 适用场景:调试代码、控制台打印日志 / 结果 时使用,省去手动写
System.out.println()包裹格式化字符串。 - 扩展:
System.err.printf()同理,用于控制台打印红色错误日志。
✔ 完整实例(和 String.format 无缝切换)
public class PrintfDemo {
public static void main(String[] args) {
String name = "李四";
int age = 30;
double score = 98.567;
// 直接控制台格式化输出,语法和String.format完全一致
System.out.printf("姓名:%s,年龄:%d,成绩:%.2f \n", name, age, score);
// 多行格式化输出
System.out.printf("浮点默认:%f \n保留1位:%.1f \n整数补0:%04d \n", score, score, age);
// 打印百分号
System.out.printf("及格率:%d%% \n", 99);
}
}
运行结果
姓名:李四,年龄:30,成绩:98.57
浮点默认:98.567000
保留1位:98.6
整数补0:0030
及格率:99%
三、方式 3:MessageFormat.format(String pattern, Object... args)
✔ 核心特点
- JDK java.text 包下的工具类,占位符语法完全不同,用
{数字索引}表示,索引从 0 开始 - 占位符:
{0}对应第一个参数,{1}对应第二个参数,{2}对应第三个参数,以此类推 - 优点:参数顺序可以随意调整、可读性更高、支持国际化 (i18n),非常适合业务场景的文案格式化(如订单、通知、提示语)
- 语法:
MessageFormat.format(格式化模板, 参数1, 参数2, ...) - 注意:需要手动导包
import java.text.MessageFormat;
✔ 基础使用实例(业务开发高频)
import java.text.MessageFormat;
public class MessageFormatDemo {
public static void main(String[] args) {
String userName = "王五";
String orderNo = "JD20260114001";
double money = 699.99;
int count = 3;
// 基础使用:{0}{1}{2}{3} 对应参数顺序
String msg1 = MessageFormat.format("用户{0}的订单{1},消费金额{2}元,商品数量{3}件",
userName, orderNo, money, count);
System.out.println(msg1);
// 输出:用户王五的订单JD20260114001,消费金额699.99元,商品数量3件
// 核心优点:调整参数顺序,模板不变,参数位置变即可(国际化核心场景)
String msg2 = MessageFormat.format("订单{1},购买人{0},数量{3},金额{2}",
userName, orderNo, money, count);
System.out.println(msg2);
// 输出:订单JD20260114001,购买人王五,数量3,金额699.99
}
}
✔ 进阶:数字 / 日期格式化(MessageFormat 专属)
MessageFormat 支持在占位符中对数字、日期做格式化,语法:
{索引, 类型, 格式},适合统一规范格式,无需额外处理数据:import java.text.MessageFormat;
import java.util.Date;
public class MessageFormatAdvance {
public static void main(String[] args) {
double price = 12999.5;
int num = 5000;
Date now = new Date();
// 格式化数字:保留2位小数、整数分组
String priceMsg = MessageFormat.format("商品价格:{0,number,###.00} 元", price);
String numMsg = MessageFormat.format("销量:{0,number,#,###} 件", num);
// 格式化日期:指定格式
String dateMsg = MessageFormat.format("下单时间:{0,date,yyyy-MM-dd HH:mm:ss}", now);
System.out.println(priceMsg); // 商品价格:12999.50 元
System.out.println(numMsg); // 销量:5,000 件
System.out.println(dateMsg); // 下单时间:2026-01-14 15:30:58
}
}
浙公网安备 33010602011771号