前言
string.format()是 java 中最核心的字符串格式化工具,能根据指定模板和参数生成标准化字符串,替代硬编码拼接,提升代码可读性和跨平台兼容性。以下是其完整、系统的用法讲解。
一、基础认知
核心作用
将普通文本与动态参数按指定格式拼接,返回格式化后的字符串(类似 c 语言printf,但不直接输出,仅返回字符串)。
核心语法
提供两个重载方法,日常开发中前者更常用:
// 1. 默认本地环境(locale):适配当前系统的数字/日期格式 public static string format(string format, object... args) // 2. 指定本地环境:比如强制使用英文/中文区域的日期/数字格式 public static string format(locale l, string format, object... args)
format:格式模板,包含普通文本和以%开头的格式说明符(占位符);args:可变参数,按顺序匹配模板中的占位符(可通过参数索引复用 / 乱序)。
二、格式说明符的完整结构
格式说明符是string.format()的核心,决定参数的格式化规则,完整结构如下:
%[参数索引$][标志][宽度][.精度]转换符
各部分含义(必选 / 可选标注):
| 组成部分 | 是否必选 | 说明 |
|---|---|---|
% | 是 | 格式说明符的起始标记。 |
| 参数索引 $ | 否 | 指定使用第几个参数(如%2$d表示第二个参数作为整数),可复用参数。 |
| 标志 | 否 | 格式化修饰符(如左对齐、补零、千分位、显示正负号)。 |
| 宽度 | 否 | 指定输出的最小字符数(不足时补空格 / 零,超出则按实际长度)。 |
| . 精度 | 否 | 浮点数:指定小数位数;字符串:指定截取长度;整数 / 字符:无意义。 |
| 转换符 | 是 | 核心,指定参数的类型(如整数、字符串、日期、进制)。 |
三、全量常用转换符
转换符决定参数的解析类型,以下是覆盖 99% 场景的全量常用转换符(标注「补充」为之前额外新增的):
| 转换符 | 类型 | 说明 | 示例(参数) | 输出效果 |
|---|---|---|---|---|
d | 整数(十进制) | 常规整数格式化 | %d (123) | 123 |
s | 字符串 | 任意对象都会调用tostring()转为字符串 | %s ("java") | java |
c | 字符 | 单个字符,参数为char或int(ascii 码) | %c ('a') | a |
b | 布尔值 | 非null/ 非false则输出true,否则false | %b (true) | true |
f | 浮点数(小数) | 默认保留 6 位小数,可通过精度调整 | %f (3.1415) | 3.141500 |
e | 科学计数法 | 浮点数转为科学计数法格式 | %e (123.45) | 1.234500e+02 |
t/t | 日期时间 | 配合子转换符使用(如%ty= 年份),t表示结果大写 | %ty (new date()) | 2025 |
%tf | 日期(iso 标准) | 【补充】快捷格式,等价于%ty-%tm-%td,输出yyyy-mm-dd | %tf (new date()) | 2025-12-26 |
%td | 日期(美式) | 【补充】快捷格式,等价于%tm/%td/%ty,输出mm/dd/yy | %td (new date()) | 12/26/25 |
x/x | 十六进制整数 | 【补充】%x小写(a-f),%x大写(a-f) | %x (255) | ff |
o | 八进制整数 | 【补充】十进制转八进制 | %o (10) | 12 |
%% | 百分号本身 | 【补充】转义输出%,直接写%会报错 | %% () | % |
%n | 换行符 | 【补充】跨平台换行(windows=\r\n,linux=\n),替代硬编码\n | %n () | 系统对应换行符 |
四、综合实战示例(覆盖所有核心场景)
以下示例整合了基础用法和补充格式符,可直接复制运行:
import java.util.date;
import java.util.locale;
public class stringformatcompletedemo {
public static void main(string[] args) {
date now = new date();
// ========== 场景1:基础类型格式化(字符串、整数、浮点数、布尔、字符) ==========
string basic = string.format(
"姓名:%s,年龄:%d,成绩:%.2f,是否及格:%b,等级:%c",
"张三", 25, 89.567, true, 'a'
);
system.out.println("基础类型:" + basic);
// 输出:姓名:张三,年龄:25,成绩:89.57,是否及格:true,等级:a
// ========== 场景2:宽度/标志修饰(补零、左对齐、千分位、正负号) ==========
string modifier = string.format(
"编号:%05d,姓名:%-10s,金额:%,d 元,温度:%+d℃",
123, "李四", 1234567, -5
);
system.out.println("宽度/标志:" + modifier);
// 输出:编号:00123,姓名:李四 ,金额:1,234,567 元,温度:-5℃
// ========== 场景3:日期时间格式化(含快捷格式%tf/%td) ==========
string date = string.format(
"iso日期:%tf,美式日期:%td,完整时间:%tf %tt%n",
now, now, now, now
);
system.out.println("日期时间:" + date);
// 输出:iso日期:2025-12-26,美式日期:12/26/25,完整时间:2025-12-26 15:30:45(示例)
// ========== 场景4:进制转换(十六进制%x、八进制%o) ==========
string radix = string.format(
"255的十六进制(大写):%04x,10的八进制:%03o",
255, 10
);
system.out.println("进制转换:" + radix);
// 输出:255的十六进制(大写):00ff,10的八进制:012
// ========== 场景5:特殊符号(百分号%%、跨平台换行%n) ==========
string special = string.format(
"成功率:%.1f%%%n第一行内容%n第二行内容",
99.5
);
system.out.println("特殊符号:" + special);
// 输出:成功率:99.5%
// 第一行内容
// 第二行内容
// ========== 场景6:参数索引(复用/乱序参数) ==========
string index = string.format(
"数字:%2$d,字符串:%1$s,再次使用数字:%2$d",
"测试", 666
);
system.out.println("参数索引:" + index);
// 输出:数字:666,字符串:测试,再次使用数字:666
}
}
五、注意事项
- 参数匹配:占位符数量需与参数数量匹配(参数索引复用除外),否则抛
missingformatargumentexception; - 类型匹配:转换符需与参数类型匹配(如
%d不能接收字符串),否则抛illegalformatconversionexception; - 浮点数精度:
%.2f会自动四舍五入(如3.145→3.15); - 转义规则:输出
%必须用%%,直接写%会被识别为格式符起始标记导致报错; - 跨平台兼容:优先用
%n替代\n,避免 windows/linux 换行符不一致问题; - 日期参数:
%tf/%td仅支持date/calendar/localdatetime等日期类型参数。
六、核心总结
- 核心结构:格式说明符的核心是
%+转换符(必选),参数索引、标志、宽度、精度为可选修饰,可灵活控制输出样式; - 高频转换符:
- 基础类型:
%d(整数)、%s(字符串)、%f(浮点数); - 日期:
%tf(iso 标准日期)、%tt(完整时间); - 特殊场景:
%x(十六进制)、%%(百分号)、%n(跨平台换行);
- 基础类型:
- 最佳实践:避免硬编码拼接字符串,用
string.format()实现标准化输出;优先用%tf/%tt简化日期格式化,用%n保证跨平台兼容性。
到此这篇关于java字符串格式化工具string.format()完整用法的文章就介绍到这了,更多相关java string.format ()用法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论