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

3 篇文章 0 订阅

一、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开始
在这里插入图片描述

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
F2007-10-27
D10/27/07
r02:25:51 下午
T14:28:16
R14:28
b月份简称
B月份全称
a星期简称
A星期全称
C年前两位(不足两位补零)
y年后两位(不足两位补零)
j当年的第几天
m月份(不足两位补零)
d日期(不足两位补零)
e日期(不足两位不补零)
H24小时制的小时(不足两位补零)
k24小时制的小时(不足两位不补零)
I12小时制的小时(不足两位补零)
i12小时制的小时(不足两位不补零)
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"))
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值