一、com
1.作用:拼接+格式/类型转换+转义,易读优雅。
以特殊的格式化字符串
来进行变量和常量的拼接。
同时可以对变量进行格式转换。可以避免冗长的字符串拼接语句。
避免使用转义
2.java和scala都支持,scala还使用StringLike类来提供语法糖,避免直接调用java的StringFormat,直接用 格式化串.format(参数*)
即可。
3.两个重载:
- format(String format, Object … args)
格式化后的新字符串使用本地默认的语言环境。 - format(Local l, String format, Pbject … args)
日期、金钱等格式化标识在不同国家地区有不同的表达方式
l为格式化过程中要应用的语言环境。如果l为null,则不进行本地化。
二、usage
1.拼接:占位符和指定位置的占位符
既然是拼接,格式化字符串就要有占位符(%x),默认情况下,占位符和后面的变量是对应的。如果需要给占位符指定变量,在占位符中间添加变量索引$
(%2$x)
注意索引从1开始
2.格式/类型转换:
整型:长度补足符+长度+类型
‘-’ 在最小宽度内左对齐,不可以与"用0填充"同时使用
‘#’ 只适用于8进制和16进制,8进制时在结果前面增加一个0,16进制时在结果前面增加0x
‘+’ 结果总是包括一个符号(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制)
’ ’ 正值前加空格,负值前加负号(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制)
‘0’ 结果将用零来填充
‘,’ 只适用于10进制,每3位数字之间用","分隔
‘(’ 若参数是负数,则结果中不添加负号而是用圆括号把数字括起来(同’+'具有同样的限制)
比如 %1$02d
%是占位符标识,d是类型,中间的1$是参数位置,2是长度,0是长度不足时要在左边补,其中长度补足符+长度只有类型为d时才有意义
浮点型
字符串:%s+参数索引x$,别的没啥格式转换
时间
常用%1$tY%1$tm%1$td
,%1$tT
转换符 | 说明 | example |
---|---|---|
c | 星期六 十月 27 14:21:20 CST 2007 | |
F | 2007-10-27 | |
D | 10/27/07 | |
r | 02:25:51 下午 | |
T | 14:28:16 | |
R | 14:28 | |
b | 月份简称 | |
B | 月份全称 | |
a | 星期简称 | |
A | 星期全称 | |
C | 年前两位(不足两位补零) | |
y | 年后两位(不足两位补零) | |
j | 当年的第几天 | |
m | 月份(不足两位补零) | |
d | 日期(不足两位补零) | |
e | 日期(不足两位不补零) | |
H | 24小时制的小时(不足两位补零) | |
k | 24小时制的小时(不足两位不补零) | |
I | 12小时制的小时(不足两位补零) | |
i | 12小时制的小时(不足两位不补零) | |
M | 分钟(不足两位补零) | |
S | 秒(不足两位补零) | |
L | 毫秒(不足三位补零) | |
N | 毫秒(不足9位补零) | |
p | 小写字母的上午或下午标记,如中文为“下午”,英文为pm | |
z | 相对于GMT的时区偏移量,如+0800 | |
Z | 时区缩写,如CST | |
s | 自1970-1-1 00:00:00起经过的秒数 | |
Q | 自1970-1-1 00:00:00起经过的豪秒 |
@Test
public void contextLoads() {
LocalDateTime localDateTime = LocalDateTime.now();
Date date = new Date();
/*
进行String.format日期转换时,被转换的必须是日期对象
官方没有提供YYYY-mm-DD HH:MM:SS 这种最常用的格式,又没有自定义格式化字符串的方法
所以只能设置多个转换符,==》就要对应设置几个格式化字符串
即使如此,这种方式也是目前发现的最优雅的
*/
System.out.println(String.format("%1$tF %1$tT", localDateTime));//因为此处引用了同一个变量2次,所以2个格串都要加参数索引,否则报错
System.out.println(String.format("%1$tY%1$tm%1$td", localDateTime));
}
输出:
2022-07-29 11:15:52
20220729
三、case
四、scala的格式化字符串
1. scala提供了StringLike,顾名思义,是对java的String的一个语法糖封装,比如String.format方法,可以直接用格式化串对象.foramt(参数集)
来表示。
println("%1$s$$%2$s".format("1", "name")) //输出:1$$name
但scala的插值器f""
不支持形如%1$
这种表示带顺序的变量
格式化规则,只能用$引入变量
println(f"2018$partIdx%02d")
example
2. 当scala中使用String.format时
args1要使用方法包装,不然报错overloaded method value format with alternatives: (x$1: java.util.Locale,x$2: String,x$3: Object*
https://blog.csdn.net/eases_stone/article/details/97814271
println(String.format("%1$02d",Int.box(1)))
println(Double.box(a).formatted("%.2f") + " , " + Double.box(b).formatted("%.2f"))