String/format + scala的格式化字符串

一、com

1.作用:拼接+格式/类型转换+转义,易读优雅。

以特殊的格式化字符串来进行变量和常量的拼接。

同时可以对变量进行格式转换。可以避免冗长的字符串拼接语句。

避免使用转义

2.java和scala都支持,scala还使用StringLike类来提供语法糖,避免直接调用java的StringFormat,直接用 格式化串.format(参数*)即可。

3.两个重载:

  1. format(String format, Object … args)
    格式化后的新字符串使用本地默认的语言环境。
  2. format(Local l, String format, Pbject … args)
    日期、金钱等格式化标识在不同国家地区有不同的表达方式
    l为格式化过程中要应用的语言环境。如果l为null,则不进行本地化。

二、usage

1.拼接:占位符和指定位置的占位符

既然是拼接,格式化字符串就要有占位符(%x),默认情况下,占位符和后面的变量是对应的。如果需要给占位符指定变量,在占位符中间添加变量索引$(%2$x)
注意索引从1开始
String/format + scala的格式化字符串_第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

String/format + scala的格式化字符串_第2张图片

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"))

你可能感兴趣的:(String,API,字符串,java,api,scala)