Java之字符串格式化大全

戚薇 Java经验 发布时间:2023-07-05 10:59:52 阅读数:16244 1
下文笔者讲述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()
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202307/16885260226999.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者