字符串格式化在日常编码过程中是必须使用的,尽管此时Java18已经推出一段时间了,大部分企业还是常用的Java8版本用于生产,所以在低版本Java中如何优雅的使用字符串格式化是很有必要的。
工具
字符串格式化有三种常用的形式
参数不兼容
%s
正常使用
1
2
3
4
5
6
|
public class Test {
public static void main(String[] args) {
String formatNormal121 = String.format("第%s行%s不能为空。", "1","displayName");
System.out.println(formatNormal121);
}
}
|
输出
缺少参数(多占位符)
会抛出MissingFormatArgumentException异常
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.util.MissingFormatArgumentException;
public class Test {
public static void main(String[] args) {
String formatNormalLessParam;
try {
formatNormalLessParam = String.format("第%s行%s不能为空。", "1");
System.out.println(formatNormalLessParam);
} catch (MissingFormatArgumentException e) {
System.out.println("format Normal Less Param error:" +e.getMessage());
// throw new RuntimeException(e);
}
}
}
|
输出
1
|
format Normal Less Param error:Format specifier '%s'
|
多余参数(少占位符)
1
2
3
4
5
6
|
public class Test {
public static void main(String[] args) {
String formatNormalMoreParam = String.format("第%s行%s不能为空。", "1","displayName","moreParameters");
System.out.println(formatNormalMoreParam);
}
}
|
输出
%1$s
正常使用
1
2
3
4
5
6
|
public class Test {
public static void main(String[] args) {
String orderFormat121 = String.format("第%1$d行%2$s不能为空。", 1, "displayName");
System.out.println(orderFormat121);
}
}
|
输出
缺少参数(多占位符)
会抛出MissingFormatArgumentException异常
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.util.MissingFormatArgumentException;
public class Test {
public static void main(String[] args) {
String orderFormatLessParam;
try {
orderFormatLessParam = String.format("第%1$d行%2$s不能为空。", 1);
System.out.println(orderFormatLessParam);
} catch (MissingFormatArgumentException e) {
System.out.println("order Format Less Param error:" +e.getMessage());
// throw new RuntimeException(e);
}
}
}
|
输出
1
|
order Format Less Param error:Format specifier '%2$s'
|
多余参数(少占位符)
1
2
3
4
5
6
|
public class Test {
public static void main(String[] args) {
String orderFormatMoreParam = String.format("第%1$d行%2$s不能为空。", 1, "displayName", "moreParameters");
System.out.println(orderFormatMoreParam);
}
}
|
输出
{0}
正常使用
1
2
3
4
5
6
|
public class Test {
public static void main(String[] args) {
String syntacticSugarFormat121= MessageFormat.format("第{0}行{1}不能为空。", 1, "displayName");
System.out.println(syntacticSugarFormat121);
}
}
|
输出
缺少参数(多占位符)
1
2
3
4
5
6
|
public class Test {
public static void main(String[] args) {
String syntacticSugarFormatLessParam= MessageFormat.format("第{0}行{1}不能为空。", 1);
System.out.println(syntacticSugarFormatLessParam);
}
}
|
输出
多余参数(少占位符)
1
2
3
4
5
6
|
public class Test {
public static void main(String[] args) {
String syntacticSugarFormatMoreParam= MessageFormat.format("第{0}行{1}不能为空。", 1, "displayName", "moreParameters");
System.out.println(syntacticSugarFormatMoreParam);
}
}
|
输出
总结
综述
高版本Java(如17+)String.format
也支持{0}
形式的格式化,低版本推荐使用MessageFormat.format
,不会抛异常。
同时String.format参数不对,Idea会在打开文件和git提交时进行类型警告,根据警告也可以处理
文件打开
git提交
新版idea为了提高性能,将此功能改为异步,先commit掉代码,如有警告和报错则提示
如果没有problem页签,去view->tool view->problem即可开启或默认快捷键alt+6
旧版本idea会进行分析,如果有警告和错误会进行二次确认
如果commit不进行代码检测说明关闭了设置,重新开启即可
类型
转 换 符 |
说 明 |
示 例 |
%s |
字符串类型 |
“mingrisoft” |
%c |
字符类型 |
’m' |
%b |
布尔类型 |
true |
%d |
整数类型(十进制) |
99 |
%x |
整数类型(十六进制) |
FF |
%o |
整数类型(八进制) |
77 |
%f |
浮点类型 |
99.99 |
%a |
十六进制浮点类型 |
FF.35AE |
%e |
指数类型 |
9.38e+5 |
%g |
通用浮点类型(f和e类型中较短的) |
|
%h |
散列码 |
|
%% |
百分比类型 |
% |
%n |
换行符 |
|
%tx |
日期与时间类型(x代表不同的日期与时间转换符 |
|
测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static void main(String[] args) {
String str=null;
//$使用
str=String.format("格式参数$的使用:%1$d,%2$s", 99,"abc");
System.out.println(str);
//+使用
System.out.printf("显示正负数的符号:%+d与%d%n", 99,-99);
//补O使用
System.out.printf("最牛的编号是:%03d%n", 7);
//空格使用
System.out.printf("Tab键的效果是:% 8d%n", 7);
//.使用
System.out.printf("整数分组的效果是:%,d%n", 9989997);
//空格和小数点后面个数
System.out.printf("一本书的价格是:% 50.5f元%n", 49.8);
}
|
输出
1
2
3
4
5
6
|
格式参数$的使用:99,abc
显示正负数的符号:+99与-99
最牛的编号是:007
Tab键的效果是: 7
整数分组的效果是:9,989,997
一本书的价格是:
|
带规则
标 志 |
说 明 |
示 例 |
结 果 |
+ |
为正数或者负数添加符号 |
("%+d",15) |
+15 |
− |
左对齐 |
("%-5d",15) |
|15 | |
0 |
数字前面补0 |
("%04d", 99) |
0099 |
空格 |
在整数之前添加指定数量的空格 |
("% 4d", 99) |
| 99| |
, |
以“,”对数字分组 |
("%,f", 9999.99) |
9,999.990000 |
( |
使用括号包含负数 |
("%(f", -99.99) |
(99.990000) |
# |
如果是浮点数则包含小数点,如果是16进制或8进制则添加0x或0 |
("%#x", 99)("%#o", 99) |
0x630143 |
< |
格式化前一个转换符所描述的参数 |
("%f和%<3.2f", 99.45) |
99.450000和99.45 |
$ |
被格式化的参数索引 |
("%1$d,%2$s", 99,“abc”) |
99,abc |
日期时间
转 换 符 |
说 明 |
示 例 |
c |
包括全部日期和时间信息 |
星期六 十月 27 14:21:20 CST 2007 |
F |
“年-月-日”格式 |
2007-10-27 |
D |
“月/日/年”格式 |
10/27/07 |
r |
“HH:MM:SS PM”格式(12时制) |
02:25:51 下午 |
T |
“HH:MM:SS”格式(24时制) |
14:28:16 |
R |
“HH:MM”格式(24时制) |
14:28 |
测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public static void main(String[] args) {
Date date=new Date();
//c的使用
System.out.printf("全部日期和时间信息:%tc%n",date);
//f的使用
System.out.printf("年-月-日格式:%tF%n",date);
//d的使用
System.out.printf("月/日/年格式:%tD%n",date);
//r的使用
System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date);
//t的使用
System.out.printf("HH:MM:SS格式(24时制):%tT%n",date);
//R的使用
System.out.printf("HH:MM格式(24时制):%tR",date);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public static void main(String[] args) {
Date date=new Date();
//b的使用,月份简称
String str=String.format(Locale.US,"英文月份简称:%tb",date);
System.out.println(str);
System.out.printf("本地月份简称:%tb%n",date);
//B的使用,月份全称
str=String.format(Locale.US,"英文月份全称:%tB",date);
System.out.println(str);
System.out.printf("本地月份全称:%tB%n",date);
//a的使用,星期简称
str=String.format(Locale.US,"英文星期的简称:%ta",date);
System.out.println(str);
//A的使用,星期全称
System.out.printf("本地星期的简称:%tA%n",date);
//C的使用,年前两位
System.out.printf("年的前两位数字(不足两位前面补0):%tC%n",date);
//y的使用,年后两位
System.out.printf("年的后两位数字(不足两位前面补0):%ty%n",date);
//j的使用,一年的天数
System.out.printf("一年中的天数(即年的第几天):%tj%n",date);
//m的使用,月份
System.out.printf("两位数字的月份(不足两位前面补0):%tm%n",date);
//d的使用,日(二位,不够补零)
System.out.printf("两位数字的日(不足两位前面补0):%td%n",date);
//e的使用,日(一位不补零)
System.out.printf("月份的日(前面不补0):%te",date);
}
|
输出
1
2
3
4
5
6
|
全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012
年-月-日格式:2012-09-10
月/日/年格式:09/10/12
HH:MM:SS PM格式(12时制):10:43:36 上午
HH:MM:SS格式(24时制):10:43:36
HH:MM格式(24时制):10:43
|
1
2
3
4
5
6
7
8
9
10
11
12
|
英文月份简称:Sep
本地月份简称:九月
英文月份全称:September
本地月份全称:九月
英文星期的简称:Mon
本地星期的简称:星期一
年的前两位数字(不足两位前面补0):20
年的后两位数字(不足两位前面补0):12
一年中的天数(即年的第几天):254
两位数字的月份(不足两位前面补0):09
两位数字的日(不足两位前面补0):10
月份的日(前面不补0):10
|
自定义时间
转 换 符 |
说 明 |
示 例 |
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 |
测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public static void main(String[] args) {
Date date = new Date();
//H的使用
System.out.printf("2位数字24时制的小时(不足2位前面补0):%tH%n", date);
//I的使用
System.out.printf("2位数字12时制的小时(不足2位前面补0):%tI%n", date);
//k的使用
System.out.printf("2位数字24时制的小时(前面不补0):%tk%n", date);
//l的使用
System.out.printf("2位数字12时制的小时(前面不补0):%tl%n", date);
//M的使用
System.out.printf("2位数字的分钟(不足2位前面补0):%tM%n", date);
//S的使用
System.out.printf("2位数字的秒(不足2位前面补0):%tS%n", date);
//L的使用
System.out.printf("3位数字的毫秒(不足3位前面补0):%tL%n", date);
//N的使用
System.out.printf("9位数字的毫秒数(不足9位前面补0):%tN%n", date);
//p的使用
String str = String.format(Locale.US, "小写字母的上午或下午标记(英):%tp", date);
System.out.println(str);
System.out.printf("小写字母的上午或下午标记(中):%tp%n", date);
//z的使用
System.out.printf("相对于GMT的RFC822时区的偏移量:%tz%n", date);
//Z的使用
System.out.printf("时区缩写字符串:%tZ%n", date);
//s的使用
System.out.printf("1970-1-1 00:00:00 到现在所经过的秒数:%ts%n", date);
//Q的使用
System.out.printf("1970-1-1 00:00:00 到现在所经过的毫秒数:%tQ%n", date);
}
|
输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
2位数字24时制的小时(不足2位前面补0):11
2位数字12时制的小时(不足2位前面补0):11
2位数字24时制的小时(前面不补0):11
2位数字12时制的小时(前面不补0):11
2位数字的分钟(不足2位前面补0):03
2位数字的秒(不足2位前面补0):52
3位数字的毫秒(不足3位前面补0):773
9位数字的毫秒数(不足9位前面补0):773000000
小写字母的上午或下午标记(英):am
小写字母的上午或下午标记(中):上午
相对于GMT的RFC822时区的偏移量:+0800
时区缩写字符串:CST
1970-1-1 00:00:00 到现在所经过的秒数:1347246232
1970-1-1 00:00:00 到现在所经过的毫秒数:1347246232773
|
Java转义字符大全
转义字符是一种特殊的字符序列,用于表示无法直接输入或打印的字符。在Java中,转义字符以反斜杠(\)开头,后跟一个或多个字符。在本文中,我们将介绍Java中常用的转义字符及其用法,以及一些常见的示例。
常见的转义字符
以下是Java中常用的转义字符:
- \t:制表符,用于在输出中插入一个制表符,相当于按下Tab键。
- \n:换行符,用于在输出中插入一个换行符,将光标移动到下一行的开头。
- \b:退格符,用于删除前一个字符。
- \r:回车符,用于将光标移动到当前行的开头。
- \f:换页符,用于在输出中插入一个换页符。
- ':单引号,用于在字符常量中插入一个单引号。
- ":双引号,用于在字符串常量中插入一个双引号。
- \:反斜杠,用于在字符串常量中插入一个反斜杠。
代码示例
下面是一些使用转义字符的代码示例:
- 制表符示例:
1
2
3
|
System.out.println("姓名\t年龄\t性别");
System.out.println("张三\t20\t男");
System.out.println("李四\t18\t女");
|
输出结果:
1
2
3
|
姓名 年龄 性别
张三 20 男
李四 18 女
|
- 换行符示例:
1
|
System.out.println("第一行\n第二行\n第三行");
|
输出结果:
- 退格符示例:
1
|
System.out.println("Hello\bWorld");
|
输出结果:
- 回车符示例:
1
|
System.out.println("第一行\r第二行\r第三行");
|
输出结果:
- 换页符示例:
1
|
System.out.println("第一页\f第二页\f第三页");
|
输出结果:
- 单引号示例:
1
2
|
char c = '\'';
System.out.println(c);
|
输出结果:
- 双引号示例:
1
2
|
String s = "\"Hello\"";
System.out.println(s);
|
输出结果:
- 反斜杠示例:
1
2
|
String path = "C:\\Program Files\\Java";
System.out.println(path);
|
输出结果:
总结
本文介绍了Java中常见的转义字符及其用法,并提供了相应的代码示例。通过使用转义字符,我们可以在输出中插入特殊字符,使输出结果更加灵活和易读。在实际编程中,我们经常会用到这些转义字符来处理各种不同的需求。因此,熟练掌握这些转义字符的用法对于Java开发者来说是非常重要的。