字符串格式化方法 format

在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));
    }
false
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)));
    }

运行结果如下:

今年是 2024 年,两位表示 24 年
现在周几:星期日
现在周几: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()需要掌握较多的转换符,这些转换符对数据格式有严格要求,错误的赋值会导致程序出现错误。在实际项目中很少使用到该方法。

转载请注明出处:码谱记录 » 字符串格式化方法 format
标签: