聊聊String.format()方法

前言

String类是我们在java开发中经常会使用到的引用类,它里面提供了很多很实用的方法,比如String.format(),我们常常利用该方法做格式化的输出,本篇文章将主要对String.format()方法的使用进行讲解。

以前我们是怎么输出字符串的

先说说使用String.format方法来输出字符串的优势,我们可以回想一下我们刚开始学习Java时,对于不确定具体内容的参数,往往是使用字符串拼接的方式来进行输出的,比如说像下面这种:

 @Test
    public void print(){
        normalPrint("小明",15,88.88);
    }

    public void normalPrint(String name,int age,double money){
        System.out.println(name + "今年" +age +"岁了,收到了"+money+"块零花钱");
    }
输出结果

我们可以看到,使用上面这种方式我们确实可以完成打印的需求,但是字符串拼接过程中其实是创建了一些我们不需要用到的字符串对象的。所以,面对这种不确定参数内容的场景,String类提供format的格式化方法来帮助我们解决这个问题。

String.format方法的使用

format方法的核心在于对占位符的使用,我们可以预先定义好一个字符串的模板,有了模板之后我们只需要提供参数就行,底层会帮助我们把参数替换到对应的占位符中。我们以上面的案例为例,做一个小优化:
定义的模板字符串为:%s今年%d岁了,收到了%f块零花钱,其中第一个%s表示会将传入的第一个字符串参数替换掉%s这个占位符,对于%d%f也是一样,分别表示整数类型和浮点类型的占位符。

@Test
    public void print(){
        normalPrint("小明",15,88.88);
    }

    public void normalPrint(String name,int age,double money){
        System.out.println(String.format("%s今年%d岁了,收到了%f块零花钱",name,age,money));
    }

从输出结果看,我们可以发现和之前使用字符串拼接的效果一模一样,但是使用format方法却有更多的好处:
(1)参数更加明确,我们可以更加方便的找到输出的元素(在多参数的输出上会体现的更加明显)
(2)降低了产生的无用内存对象

输出结果

常用的占位符

下面我们将对format方法中常用的占位符进行介绍:

其中我们用的比较多的,一般是字符串、整数、浮点、日期相关的占位符多一些。

转换(占位)符 详细说明 示例
%s 字符串类型 “喜欢请收藏”
%c 字符类型 ‘m’
%b 布尔类型 true
%d 整数类型(十进制) 88
%x 整数类型(十六进制) FF
%o 整数类型(八进制) 77
%f 浮点类型 8.888
%a 十六进制浮点类型 FF.35AE
%e 指数类型 9.38e+5
%n 换行符
%tx 日期与时间类型(x代表不同的日期与时间转换符)

我们以上面的占位符为例做一个小例子:

@Test
public void formatTest(){
        String formatPattern = "%tF %s开张了,收益为%f元 %n 顾客满意度为 %s";
        System.out.println(String.format(formatPattern, LocalDateTime.now(),"钱大妈",666.66,"一般"));
    }
输出结果

特殊符号的占位符

标志 说明 说明 结果
+ 为正数或者负数添加符号,因为 一般整数不会主动加符号 (“%+d”,15) +15
0 数字前面补0,用于对齐 (“%04d”, 99) 0099
数字 在整数之前添加指定数量的空格 (“%4d”, 99) 99
, 以“,”对数字分组(常用显示金额) (“%,f”, 9999.99) 9,999.990000
( 使用括号包含负数 (“%(f”, -99.99) (99.990000)

我们使用这些特殊的占位符来做一个小测试:

@Test
    public void specialFormatTest(){
        // %+ 可以显示数字的正负符号
        System.out.println(String.format("the number is %+d",19));
        // %04d , 表示该整数最少占4位,不够4位的在前面用0充当占位符
        // 这个属性常常利用做格式化的对齐
        System.out.println(String.format("the number is %04d",19));
        // %,  对于数字进行分割(每3个整数位数字分割一次)
        System.out.println(String.format("the number is %,d",99999999));
        // %(  表示将使用括号来对"负数"进行包裹,比如 -88会被转换输出为 (88)
        System.out.println(String.format("the number is %(d",-888888));
    }
输出结果

日期占位符

我们在常用占位符的介绍中提到了可以通过%tx的方式来定义日期占位符,其中x就需要我们再根据需要填入对应的日期格式。

标志 说明 示例
c 包括全部日期和时间信息 周四 10月 21 14:52:10 GMT+08:00 2021
F “年-月-日”格式 2021-10-21
D “月/日/年”格式 10/21/21
r “HH:MM:SS PM”格式 (12时制) 02:53:20 下午
T “HH:MM:SS”格式(24时制) 14:53:39
R “HH:MM” 格式(24时制) 14:53
b 月份本地化 10月
y 两位的年 21
Y 四位的年 2021
m 10
d 21
H 24小时制的时 14
l 12小时制的时 2
M 57
S 46
s 秒为单位的时间戳 1634799527
p 上午还是下午 下午

同样的,我们根据上面提供的日期占位符来做一个简单的例子:
我们可以看到,我们定义的模板字符串为:today is %1$tY-%1$tm-%1$td,理论上我们需要填入三个参数,但实际上我们只提供了1个日期类,原因是当1个参数会在模板字符串中多次使用时,我们可以使用数字$的方式来对指定位置的参数进行替换。比如说1$表示的就是这里将使用第1个参数进行替换。
同时,还需要注意,我们的索引占位符数字$是需要写在%之后的,否则会识别错误。

@Test
    public void formatTest(){
        System.out.println(String.format("today is %1$tY-%1$tm-%1$td",new Date()));
    }
输出结果

至此,对于String.format方法我们就介绍到这里。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容