Java 字符串格式化

一、方式 1:String.format(String format, Object... args) 

 

✔ 核心特点

 
  1. Java 最通用、最高频的格式化方式,没有之一
  2. 语法继承自 C 语言 printf,通用性极强,所有 Java 版本兼容
  3. 返回值是格式化后的字符串,可以赋值给变量、存储、传输、打印,灵活度拉满
  4. 语法: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) 

 

✔ 核心特点

 
  1. 语法和 String.format 完全一模一样,占位符、修饰符通用,不用重新记!
  2. 区别:printf直接将格式化后的内容输出到控制台没有返回值String.format 是返回格式化后的字符串,不会自动打印。
  3. 适用场景:调试代码、控制台打印日志 / 结果 时使用,省去手动写 System.out.println() 包裹格式化字符串。
  4. 扩展: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) 

 

✔ 核心特点

 
  1. JDK java.text 包下的工具类,占位符语法完全不同,用 {数字索引} 表示,索引从 0 开始
  2. 占位符:{0} 对应第一个参数,{1} 对应第二个参数,{2} 对应第三个参数,以此类推
  3. 优点:参数顺序可以随意调整可读性更高支持国际化 (i18n),非常适合业务场景的文案格式化(如订单、通知、提示语)
  4. 语法:MessageFormat.format(格式化模板, 参数1, 参数2, ...)
  5. 注意:需要手动导包 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
    }
}
 

posted on 2026-01-14 09:45  coding博客  阅读(12)  评论(0)    收藏  举报