Java之字符串格式化大全
下文笔者讲述java字符串格式化方法大全,如下所示
例:时间格式化的示例
例:日期转换示例
例
字符串格式化方法说明
字符串格式化的用途: 用于格式化字符串 字符串格式化的语法包含两部分: 格式化字符串 参数列表 格式化字符串:一个固定文本,里面嵌入了一些格式占位符 参数列表:用于替换格式占位符的参数值
字符串格式化的语法
String.format(String format, Object… args) String.format(Locale locale, String format, Object… args) 以上两个方法的唯一区别: 前者使用本地语言环境 后者使用指定语言环境
format支持的数据类型
General:可应用于任何参数类型 Character:可应用于代表 Unicode字符基本类型 char,Character,byte,Byte,short 和 Short 当Character.isValidCodePoint(int) 返回 true 时 这种转换也可以应用于 int 和 Integer 类型。 Numeric a. Integral: 可应用于Java 整数类型: byte,Byte,short,Short,int,Integer,long,Long 和 BigInteger(但不适用 char 和 Character 类型) b. Floating Point 可应用于 Java 浮点类型: float,Float,double,Double 和 BigDecimal Date/Time: 可应用于能够对日期或时间进行编码的Java 类型: long、Long、Calendar、Date 和TemporalAccessor; Percent: 生成一个的 “%”(‘\u0025’); Line Separator: 生成平台专用的行分隔符
转换符和参数类别说明
转换符 | 参数类别 | 备注 |
‘b’, ‘B’ | general | 如果参数 arg 为 null,则结果为 false;如果 arg 是 boolean 或者 Boolean,则会执行String.valueOf(arg) 方法,返回结果;否则,结果为 true。 |
‘h’, ‘H’ | general | 如果参数 arg 为 null,则结果为 null;否则,执行 Integer.toHexString(arg.hashCode()) 方法,返回结果。 |
‘s’, ‘S’ | general | 如果参数 arg 为 null,则结果为 null;如果 arg 实现了 Formattable 接口,则会执行 arg.formatTo() 方法,返回结果;否则,执行 arg.toString() 方法,返回结果。 |
‘c’, ‘C’ | character | 结果是一个 Unicode 字符。 |
‘d’ | integral | 结果格式化为十进制的整数。 |
‘o’ | integral | 结果格式化为八进制的整数。 |
‘x’, ‘X’ | integral | 结果格式化为十六进制的整数。 |
‘e’, ‘E’ | floating point | 结果以计算机科学计数形式格式化为十进制数。 |
‘f’ | floating point | 结果格式化为十进制数字。 |
‘g’, ‘G’ | floating point | 根据精度和舍入后的值,使用计算机科学计数法或十进制格式对结果进行格式化。 |
‘a’, ‘A’ | floating point | 其结果被格式化为一个十六进制的浮点数,带有一个显数和一个指数。BigDecimal 类型不支持这种转换,尽管后者属于浮点参数类别。 |
‘t’, ‘T’ | date/time | 日期和时间转换字符的前缀。 |
‘%’ | percent | 结果是文字 ‘%’。‘n’ line separator 结果是特定于平台的行分隔符。 |
format示例
public static void main(String[] args) { System.out.println(String.format("转换符是 b,参数是 null,格式化结果:%b", null)); System.out.println(String.format("转换符是 b,参数是 false,格式化结果:%b", false)); System.out.println(String.format("转换符是 b,参数是 new Boolean(true),格式化结果:%b", new Boolean(true))); System.out.println(String.format("转换符是 b,参数是空字符串,格式化结果:%b", "")); System.out.println(String.format("转换符是 b,参数是 1,格式化结果:%b", 1)); } //运行以上代码,将输出以下信息 转换符是 b,参数是 null,格式化结果:false 转换符是 b,参数是 false,格式化结果:false 转换符是 b,参数是 new Boolean(true),格式化结果:true 转换符是 b,参数是空字符串,格式化结果:true 转换符是 b,参数是 1,格式化结果:true public static void main(String[] args) { System.out.println(String.format("转换符是 s,参数是 null,格式化结果:%s", null)); System.out.println(String.format("转换符是 s,参数是 \"测试\",格式化结果:%s", "测试")); } //运行以上代码,将输出以下信息 转换符是 s,参数是 null,格式化结果:null 转换符是 s,参数是 "测试",格式化结果:测试
Argument Index
format中可使用参数索引的写法 参数索引从1开始记数 如: 1$ 表示第一个参数,2$ 表示第二个参数,以此类推 public static void main(String[] args) { Calendar c = Calendar.getInstance(); String s = String.format("Java265的生日是:%1$tY-%1$tm-%1$te", c); System.out.println(s); } //运行以上代码,将输出以下信息 Java265的生日是:2023-07-05
Flags
flags: 是可选参数,用于控制输出的格式 如: 左对齐、金额用逗号隔开等
public static void main(String[] args) { System.out.println(String.format("flags 是 -,参数是 1,格式化结果:%-8d.", 1)); System.out.println(String.format("flags 是 #,参数是 99,格式化结果:%#x.", 99)); System.out.println(String.format("flags 是 #,参数是 99,格式化结果:%#o.", 99)); System.out.println(String.format("flags 没有,参数是 10.0,格式化结果:%f.", 10.0)); System.out.println(String.format("flags 是 #,参数是 10.0,格式化结果:%#f.", 10.0)); System.out.println(String.format("flags 没有,参数是 10.1234564,格式化结果:%f.", 10.1234564)); System.out.println(String.format("flags 是 #,参数是 10.1234564,格式化结果:%#f.", 10.1234564)); System.out.println(String.format("flags 没有,参数是 10.1234565,格式化结果:%f.", 10.1234565)); System.out.println(String.format("flags 是 #,参数是 10.1234565,格式化结果:%#f.", 10.1234565)); System.out.println(String.format("flags 是 +,参数是 10,格式化结果:%+d.", 10)); System.out.println(String.format("flags 是 +,参数是 -10,格式化结果:%+d.", -10)); System.out.println(String.format("flags 是 +,参数是 10,格式化结果:% 6d.", 10)); System.out.println(String.format("flags 是 +,参数是 -10,格式化结果:% 6d.", -10)); System.out.println(String.format("flags 是 +,参数是 10,格式化结果:%06d.", 10)); System.out.println(String.format("flags 是 +,参数是 -10,格式化结果:%06d.", -10)); System.out.println(String.format("flags 是 +,参数是 9999999,格式化结果:%,6d.", 9999999)); System.out.println(String.format("flags 是 +,参数是 -9999999,格式化结果:%,6d.", -9999999)); System.out.println(String.format("flags 是 +,参数是 -9999999.1234567,格式化结果:%,6f.", -9999999.1234567)); System.out.println(String.format("flags 是 (,参数是 -10,格式化结果:%(d.", -10)); } //运行以上代码,将输出以下信息 flags 是 -,参数是 1,格式化结果:1 . flags 是 #,参数是 99,格式化结果:0x63. flags 是 #,参数是 99,格式化结果:0143. flags 没有,参数是 10.0,格式化结果:10.000000. flags 是 #,参数是 10.0,格式化结果:10.000000. flags 没有,参数是 10.1234564,格式化结果:10.123456. flags 是 #,参数是 10.1234564,格式化结果:10.123456. flags 没有,参数是 10.1234565,格式化结果:10.123457. flags 是 #,参数是 10.1234565,格式化结果:10.123457. flags 是 +,参数是 10,格式化结果:+10. flags 是 +,参数是 -10,格式化结果:-10. flags 是 +,参数是 10,格式化结果: 10. flags 是 +,参数是 -10,格式化结果: -10. flags 是 +,参数是 10,格式化结果:000010. flags 是 +,参数是 -10,格式化结果:-00010. flags 是 +,参数是 9999999,格式化结果:9,999,999. flags 是 +,参数是 -9999999,格式化结果:-9,999,999. flags 是 +,参数是 -9999999.1234567,格式化结果:-9,999,999.123457. flags 是 (,参数是 -10,格式化结果:(10).
Width
Width也是可选参数 关于这个参数 用于控制输出的宽度例
public static void main(String[] args) { System.out.println(String.format("width 是 6,不满 6 位用 0 填充,参数是 10,格式化结果:%06d.", 10)); } //运行以上程序,将输出以下信息 width 是 6,不满 6 位用 0 填充,参数是 10,格式化结果:000010.
width不能设置为0 否则可能会报错 如: 上面的例子 将width设置为0 public static void main(String[] args) { System.out.println(String.format("width 是 0,不满 6 位用 0 填充,参数是 10,格式化结果:%00d.", 10)); } //运行以上程序,将输出以下信息 Exception in thread "main" java.util.DuplicateFormatFlagsException: Flags = '0' at java.util.Formatter$Flags.parse(Formatter.java:4443) at java.util.Formatter$FormatSpecifier.flags(Formatter.java:2640) at java.util.Formatter$FormatSpecifier. init (Formatter.java:2709) at java.util.Formatter.parse(Formatter.java:2560) at java.util.Formatter.format(Formatter.java:2501) at java.util.Formatter.format(Formatter.java:2455) at java.lang.String.format(String.java:2940) at Test9.Test5.main(Test5.java:10)
Precision
Precision是可选参数 用于限定输出的精度 用于格式化浮点数类型
public static void main(String[] args) { System.out.println(String.format("precision 是 2,设置精度为 2,参数是 9.1234,格式化结果:%.2f.", 9.1234)); } //运行以上代码,将输出以下信息 precision是2 设置精度为2 参数是9.1234 格式化结果:9.12
注意事项: 不能对整型类型参数设置精度 否则会抛出异常 public static void main(String[] args) { System.out.println(String.format("precision 是 2,设置精度为 2,参数是 10,格式化结果:%.2d.", 10)); } //运行以上代码,将输出以下信息 Exception in thread "main" java.util.IllegalFormatPrecisionException: 2 at java.util.Formatter$FormatSpecifier.checkInteger(Formatter.java:2984) at java.util.Formatter$FormatSpecifier. init (Formatter.java:2729) at java.util.Formatter.parse(Formatter.java:2560) at java.util.Formatter.format(Formatter.java:2501) at java.util.Formatter.format(Formatter.java:2455) at java.lang.String.format(String.java:2940) at Test9.Test5.main(Test5.java:10)
日期时间类型格式化
String.format()方法: 提供很多关于日期时间类型的格式化 日期时间格式化相比常规类型格式化少precision(精度) 同时conversion 是由两个字符组成 且第一个字符固定为 ‘t’ 或 ‘T’ 第二个字符,日期时间格式化的转换符 可以分为如下三类: 时间格式化转换符; 日期格式化转换符; 日期时间格式化转换符
时间格式化转换符
转换符 | 说明 | 示例 |
H | 2 位数字 24 时制的小时,不足 2 位前面补 0。 | 15 |
I | 2 位数字 12 时制的小时,不足 2 位前面补 0。 | 03 |
k | 2 位数字 24 时制的小时,前面不补 0。 | 15 |
l | 2 位数字 12 时制的小时,前面不补 0。 | 3 |
M | 2 位数字的分钟,不足 2 位前面补 0。 | 03 |
S | 2 位数字的秒,不足 2 位前面补 0。 | 09 |
L | 3 位数字的毫秒,不足 3 位前面补 0。 | 015 |
N | 9 位数字的毫秒,不足 9 位前面补 0。 | 562000000 |
p | 小写字母的上午或下午标记。 | 中:下午 英:pm |
z | 相对于 GMT 的 RFC822 时区的偏移量。 | +0800 |
Z | 时区缩写字符串。 | CST |
s | 1970-1-1 00:00:00 到现在所经过的秒数。 | 1193468128 |
Q | 1970-1-1 00:00:00 到现在所经过的毫秒数。 | 1193468128984 |
public static void main(String[] args) { Date date = new Date(); System.out.println(String.format("2 位数字 24 时制的小时,不足 2 位前面补 0:%tH", date)); System.out.println(String.format("2 位数字 12 时制的小时,不足 2 位前面补 0:%tI", date)); System.out.println(String.format("2 位数字 24 时制的小时,前面不补 0:%tk", date)); System.out.println(String.format("2 位数字 12 时制的小时,前面不补 0:%tl", date)); System.out.println(String.format("2 位数字的分钟,不足 2 位前面补 0:%tM", date)); System.out.println(String.format("2 位数字的秒,不足 2 位前面补 0:%tS", date)); System.out.println(String.format("3 位数字的毫秒,不足 3 位前面补 0:%tL", date)); System.out.println(String.format("9 位数字的毫秒,不足 9 位前面补 0:%tN", date)); System.out.println(String.format(Locale.US, "小写字母的上午或下午标记(英):%tp", date)); System.out.println(String.format("小写字母的上午或下午标记(中):%tp", date)); System.out.println(String.format("相对于 GMT 的 RFC822 时区的偏移量:%tz", date)); System.out.println(String.format("时区缩写字符串:%tZ", date)); System.out.println(String.format("1970-1-1 00:00:00 到现在所经过的秒数:%ts", date)); System.out.println(String.format("1970-1-1 00:00:00 到现在所经过的毫秒数:%tQ", date)); } //运行以上代码,将输出以下信息 2 位数字 24 时制的小时,不足 2 位前面补 0:23 2 位数字 12 时制的小时,不足 2 位前面补 0:11 2 位数字 24 时制的小时,前面不补 0:23 2 位数字 12 时制的小时,前面不补 0:11 2 位数字的分钟,不足 2 位前面补 0:31 2 位数字的秒,不足 2 位前面补 0:30 3 位数字的毫秒,不足 3 位前面补 0:421 9 位数字的毫秒,不足 9 位前面补 0:421000000 小写字母的上午或下午标记(英):pm 小写字母的上午或下午标记(中):pm 相对于 GMT 的 RFC822 时区的偏移量:+0800 时区缩写字符串:CST 1970-1-1 00:00:00 到现在所经过的秒数:1621956690 1970-1-1 00:00:00 到现在所经过的毫秒数:1621956690421
日期格式化转换符
转换符 | 说明 | 示例 |
‘b’ or ‘h’ | 月份简称。 | 中:十月 英:Oct |
‘B’ | 月份全称。 | 中:十月英:October |
‘a’ | 星期的简称。 | 中:星期六 英:Sat |
‘A’ | 星期的全称。 | 中:星期六 英:Saturday |
‘C’ | 年的前两位数字,不足两位前面补 0。 | 20 |
‘y’ | 年的后两位数字,不足两位前面补 0。 | 21 |
‘Y’ | 4 位数字的年份,不足 4 位前面补 0。 | 2023 |
‘j’ | 一年中的天数,即年的第几天。 | 300 |
‘m’ | 两位数字的月份,不足两位前面补 0。 | 01 |
‘d’ | 月份的日,两位数字,不足两位前面补 0。 | 05 |
‘e’ | 月份的日,前面不补 0。 | 5 |
public static void main(String[] args) { Date date = new Date(); System.out.println(String.format(Locale.US, "月份简称,英文:%tb", date)); System.out.println(String.format(Locale.US, "月份简称,英文:%th", date)); System.out.println(String.format(Locale.SIMPLIFIED_CHINESE, "月份简称,中文:%tb", date)); System.out.println(String.format(Locale.SIMPLIFIED_CHINESE, "月份简称,中文:%th", date)); System.out.println(String.format(Locale.US, "月份全称,英文:%tB", date)); System.out.println(String.format(Locale.SIMPLIFIED_CHINESE, "月份全称,中文:%tB", date)); System.out.println(String.format(Locale.US, "星期的简称,英文:%ta", date)); System.out.println(String.format(Locale.SIMPLIFIED_CHINESE, "星期的简称,英文:%ta", date)); System.out.println(String.format(Locale.US, "星期的全称,英文:%tA", date)); System.out.println(String.format(Locale.SIMPLIFIED_CHINESE, "星期的全称,英文:%tA", date)); System.out.println(String.format("年的前两位数字,不足两位前面补 0:%tC", date)); System.out.println(String.format("年的后两位数字,不足两位前面补 0:%ty", date)); System.out.println(String.format("4 位数字的年份,不足 4 位前面补 0:%tY", date)); System.out.println(String.format("一年中的天数,即年的第几天:%tj", date)); System.out.println(String.format("两位数字的月份,不足两位前面补 0:%tm", date)); System.out.println(String.format("月份的日,两位数字,不足两位前面补 0:%td", date)); System.out.println(String.format("月份的日,前面不补 0:%te", date)); } //运行以上代码,将输出以下信息 月份简称,英文:May 月份简称,英文:May 月份简称,中文:五月 月份简称,中文:五月 月份全称,英文:May 月份全称,中文:五月 星期的简称,英文:Wed 星期的简称,英文:星期三 星期的全称,英文:Wednesday 星期的全称,英文:星期三 年的前两位数字,不足两位前面补 0:20 年的后两位数字,不足两位前面补 0:23 4 位数字的年份,不足 4 位前面补 0:2023 一年中的天数,即年的第几天:146 两位数字的月份,不足两位前面补 0:05 月份的日,两位数字,不足两位前面补 0:26 月份的日,前面不补 0:26
日期时间格式化转换符
转换符 | 说明 | 示例 |
‘c’ | 包括全部日期和时间信息 | 星期三 五月 26 14:48:23 CST 2022 |
‘F’ | “年-月-日” 格式 | 2023-07-05 |
‘D’ | “月/日/年” 格式 | 07/21/2022 |
‘r’ | “HH:MM:SS PM” 格式,12 时制 | 02:48:23 下午 |
‘T’ | “HH:MM:SS” 格式,24 时制 | 14:48:23 |
‘R’ | “HH:MM” 格式,24 时制 | 14:48 |
public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse("2023-07-05 14:48:23"); System.out.println(String.format("包括全部日期和时间信息:%tc", date)); System.out.println(String.format("\"年-月-日\" 格式:%tF", date)); System.out.println(String.format("\"月/日/年\" 格式:%tD", date)); System.out.println(String.format("\"HH:MM:SS PM\" 格式,12 时制:%tr", date)); System.out.println(String.format("\"HH:MM:SS\" 格式,24 时制:%tT", date)); System.out.println(String.format("\"HH:MM\" 格式,24 时制:%tR", date)); } //运行以上代码,将输出以下信息 包括全部日期和时间信息:Wed May 26 14:48:23 CST 2021 "年-月-日" 格式:2023-07-05 "月/日/年" 格式:05/26/21 "HH:MM:SS PM" 格式,12 时制:02:48:23 PM "HH:MM:SS" 格式,24 时制:14:48:23 "HH:MM" 格式,24 时制:14:48
字符串格式化总结说明: 1.String类提供两个格式化重载方法(format) 2.System.out.printf(String format, Object … args) 方法也支持与字符串格式化一样的语法; 3.字符串格式化的语法中: 当格式化字符串中使用argument_index,则所有占位符都要加上; 4.参数width 不能设置为 0,否则可能会报错; 5.不能对整型类型参数设置 precision(精度),否则会抛出异常; 6.部分简单日期时间类型的格式化可以直接使用String.format()
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。