在JAVA 中,字符串格式化可以使用format方法,通过指定的格式字符串和参数返回一个格式化字符串。
常规字符串格式化
方法声明
public static String format(String format,Object...args)
- format:格式字符串。
- args:格式字符串中由格式说明符引用的参数。参数数目是可变的,可以为0。
常规类型的格式化可应用于任何参数类型,可通过如下表所示的转换符来实现。
转换符 | 说明 | 取值样例 |
---|---|---|
%b、%B | 格式化为布尔类型 | false |
%h、%H | 格式化为散列码 | A123571 |
%s、%S | 格式化为字符串类型 | “Java” |
%c、%C | 格式化为字符类型 | ‘a’ |
%d | 格式化为十进制整数 | 66 |
%0 | 格式化为八进制整数 | 23 |
%x、%X | 格式化为十六进制整数 | 2b |
%e | 格式化为用计算机科学记数法表示的十进制数 | 2.300000e+01 |
%a | 格式化为带有效位数和指数的十六进制浮点值 | 0X1.C00000001P2 |
%n | 结果为特定于平台的行分隔符 | |
%% | 结果为字面值’%’ | % |
public static void main(String[] args) {
System.out.println(String.format("%b", false));
System.out.println(String.format("%d", 66));
System.out.println(String.format("%o", 66));
System.out.println(String.format("%x", 66));
System.out.println(String.format("%e", 1.2e01));
System.out.println(String.format("%%", 66));
System.out.println(String.format("学习 %s 的第 %d 天", "Java", 999));
}
66
102
42
1.200000e+01
%
学习 Java,的第 999 天
上面参数都是严格按照正确的格式设定的,但是我们在编写程序时,可能遇到下面几种场景:
参数不全
下面代码有两处需要格式化的地方,其中 ‘Java’ 对应的 ‘%s’,剩下的 ‘%d’ 没有赋值。
System.out.println(String.format("学习 %s 的第 %d 天", "Java"));
这样会出现异常:java.util.MissingFormatArgumentException: Format specifier ‘%d’
数据格式不对
下面代码有两处需要格式化的地方,其中 ‘%s’ 对应的应该为 String 类型的字符串,但是给了一个布尔值 true。
System.out.println(String.format("学习 %s 的第 %d 天", true, "JDK"));
这样会出现异常:java.util.IllegalFormatConversionException: d != java.lang.String
转换符不存在
下面代码有两处需要格式化的地方,其中 ‘%m’ 不属于Java定义的转换符。
System.out.println(String.format("学习 %s 的第 %m 天", "Java", 123));
这样会出现异常:java.util.UnknownFormatConversionException: Conversion = ‘m’
参数传多了
下面代码有两处需要格式化的地方,但是传了三个参数。
System.out.println(String.format("学习 %s 的第 %d 天", "Java", 123, 23.5));
这种可以正确的得到结果,多传入的参数 23.5 会被忽略。
日期时间相关字符串格式化
方法声明
public static String format(Locale l ,String format,Object...args)
- l: 格式化过程中要应用的语言环境。如果 Locale 为null,则不进行本地化。
Locale 是 JDK 中一个本地化相关的类。主要是在一些需要支持国际化显示的地方,提供差异化能力。
转换符 | 说明 | 取值样例 |
---|---|---|
%te | 一个月中的某一天(1~31) | 17 |
%tb | 指定语言环境的月份简称 | Jan(英文)、一月(中文) |
%tB | 指定语言环境的月份全称 | February(英文)、二月(中文) |
%tA | 指定语言环境的星期几全称 | Monday(英文)星期五(中文) |
%ta | 指定语言环境的星期几简称 | Mon(英文)、星期五(中文) |
%tc | 包括全部日期和时间信息 | Sun Mar 17 12:20:52 CST 2024 |
%tY·t0 | 4位年份 | 2024 |
%tj | 年中的第几天(001一366) | 060 |
%tm | 月份 | 03 |
%td | 个月中的第几天(01~31) | 17 |
ty | 二位年份 | 24 |
%tc 包含完整的日期时间信息,代表了完整格式 ‘%ta %tb %td %tT %tZ %tY’
public static void main(String[] args) {
System.out.println(String.format("今年是 %tY 年,两位表示 %ty 年", new Date(), new Date()));
System.out.println(String.format(Locale.CHINA,"现在周几:%ta", new Date()));
System.out.println(String.format(Locale.US,"现在周几:%ta", new Date()));
System.out.println(String.format("中文环境今天是:%tc", new Date()));
System.out.println(String.format(Locale.US,"英文环境今天是:%tc", new Date()));
System.out.println(String.format(Locale.US,"中文环境现在几月:%tB %tb", new Date(), new Date()));
System.out.println(String.format(Locale.CHINESE,"英文环境现在几月:%tb %tb", new Date(), new Date()));
System.out.println(String.format("月初几号:%%te %te %%td %td", new Date(1709222400000L), new Date(1709222400000L)));
}
运行结果如下:
现在周几:星期日
现在周几:Sun
中文环境今天是:星期日 三月 17 22:55:27 CST 2024
英文环境今天是:Sun Mar 17 22:55:27 CST 2024
中文环境现在几月:March Mar
英文环境现在几月:三月 三月
月初几号:%te 1 %td 01
当前电脑默认为中文环境,因此时间为中文格式,也可以通过 Locale.CHINA/Locale.CHINESE 指定为中文环境。
想要将转换符原样输出,在 % 前面再加一个 %,也就是两个 %%。
总结
文章介绍了Java中字符串格式化方法format()的用法,包括常规格式和日期时间相关的格式化,以及可能遇到的问题。
使用 String 的 format()需要掌握较多的转换符,这些转换符对数据格式有严格要求,错误的赋值会导致程序出现错误。在实际项目中很少使用到该方法。