JDK1.5开始String类中提供了一个非常有用的方法String.format(String format, Object ... args)

查看源码得知其实是调用了java.util.Formatter.format(String, Object...)方法

public static String format(String format, Object ... args) {return new Formatter().format(format, args).toString();
}

String.format(String format, Object ... args) 这个方法最重要的的地方就是它的第一个参数String format,我们只要掌握了这个参数的用法也就掌握了String.format的用法

首先来看一个列子

String s2 = String.format("%1$tY-%1$tm-%1$te", new Date());
System.out.println(s2);

这里会打印出什么内容?

先不急着去运行它,相信阅读到后面不用运行,你也会知道的.

查看JDK文档得知,String.format方法的第一个参数是有个公式可以套的

%[argument_index$][flags][width][.precision]conversion

这里我们只要牢记这个公式就可以,下面说下每个颜色所代表的含义

argument_index: 可选,是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用,第二个参数由 "2$" 引用,依此类推。

flags: 可选,用来控制输出格式

width: 可选,是一个正整数,表示输出的最小长度

precision:可选,用来限定输出字符数

conversion:必须,用来表示如何格式化参数的字符

先看一个简单的列子:

System.out.println(String.format("我的名字叫%s", "小明")); // 打印:我的名字叫小明

这里我们只用了%s这个简单的表达式,对比上面的公式,我们发现[argument_index$][flags][width][.precision]这些部分全部都省略掉了

只留下一个必须的conversion,在这里conversion就是"s",百分号%是固定不变的

[argument_index$]省略之后它会自动把"小明"这个值填入到%s中去

我再稍微改下列子:

String.format("我叫%s,她叫%s", "小明","小方"); // 我叫小明,她叫小方

这里会按顺序分别把小明,小方填入到对应的%s中. 如果我们要把小方填在前面,小明填在后面,那该怎么做呢,[argument_index$]就派上用场了

String.format("我叫%2$s,她叫%1$s", "小明","小方"); // 我叫小方,她叫小明

依然是百分号%开头,中间多了个2$,1$

conversion可以填s,那还有什么其它字母可以填呢,当然有的比如

o:结果被格式化为八进制整数

x:结果被格式化为十六进制

d:结果被格式化为十进制整数

System.out.println(String.format("%o", 8)); // 10
System.out.println(String.format("%x", 16)); // 10

更多的conversion类别可以参考JDK文档java.util.Formatter类

至此,我们已经了解了argument_index$和conversion的用处,接下来我们了解flag和width的用法

flag是用来控制输出格式的,比如左对齐,金额用逗号隔开等

width:表示最小宽度

先看个列子:

String.format("%1$,d", 12302562); // 12,302,562

这里多出一个逗号",",它就是flag,用于金额千分位隔开,当然写成"%,d"也是可以的

再一个列子:

String.format("%1$08d", 123456);// 00123456

这里0就是flag,表示结果将用零来填充,8就是width,表示最少要8位,d是conversion

至于其它的flag可以查阅JDK文档

接下来说下[.precision]

这个单词翻译下是精度的意思,我们发现了前面有个小数点".",因此不难联想到这个是关于浮点数类型的

只有当传入的数据是浮点数时这个才有用,整数或者日期类型的数据都不能用

比如我想要四舍五入保留两位小数,那么我可以这么写:

String.format("%1$.2f", 12.12555);// 12.13

这里f表示传入的数字是浮点型,如果传入的是整数,或者把f改成d都会抛出异常,JDK文档中有明确说明

对于浮点转换 'e''E' 和 'f',精度是小数点分隔符后的位数。如果转换是 'g' 或 'G',那么精度是舍入计算后所得数值的所有位数。如果转换是 'a' 或 'A',则不必指定精度。

对于字符、整数和日期/时间参数类型转换,以及百分比和行分隔符转换,精度是不适用的;如果提供精度,则会抛出异常。

到现在为止这套表达式公式已经基本讲完了,这套公式是针对于基本数据类型,和字符串的,如果是正对于时间类型的数据该怎么做呢,比如格式化日期

其实文档中已经给出说明了:

  • 用来表示日期和时间类型的格式说明符的语法如下:

       %[argument_index$][flags][width]conversion

    可选的 argument_index、flags 和 width 的定义同上。

    所需的 conversion 是一个由两字符组成的序列。第一个字符是 't' 或 'T'。第二个字符表明所使用的格式。这些字符类似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定义的字符。

    需要注意的是conversion 是一个由两字符组成的序列。第一个字符是 't' 或 'T'

    也就是说用conversion的时候首先必要写一个"t",然后在写其它conversion

    时间类型有它自己的一套conversion,我们简单的选择几个来说:

    'Y' 年份,被格式化为必要时带前导零的四位数(至少),例如,0092 等于格里高利历的 92 CE。
    'm' 月份,被格式化为必要时带前导零的两位数,即 01 - 13
    'd' 一个月中的天数,被格式化为必要时带前导零两位数,即 01 - 31

    上面三个分别表示年月日

    如果我要显示年份,我就可以"%tY",显示月份我就可以写"%tm",记得一定要带上"t"

    那么本篇一开始提到的那串复杂的表达式现在看来是不是很简单呢:

    String s2 = String.format("%1$tY-%1$tm-%1$te", new Date());
    System.out.println(s2);
    

    String.format()方法差不多讲完了,仔细看JDK文档也会慢慢了解的

    需要批量进行格式化时,考虑下DateFormat, MessageFormat, NumberFormat 把他们封装成一个静态工具类或许更好

    毕竟调用String.format()方法是会new一个Formatter对象,虽然有GC帮忙,但是平时编程的时候还是要考虑这些因素的

    尽量少的创建对象,节省资源

StringUtil.format使用介绍相关推荐

  1. FFmpeg的视频format滤镜介绍

    视频的 format 滤镜是一个非常常用的滤镜,用来转换图像的格式,例如可以把 AV_PIX_FMT_YUV420P 转成 AV_PIX_FMT_RGB24. 我们可以用以下命令查询 format 滤 ...

  2. 使用 dotnet format 格式化代码

    使用 dotnet format 格式化代码 Intro dotnet-format 在之前的版本是一个独立的命令行工具,在 .NET 6 里已经成为了 SDK 的一部分,我们可以使用,使用 dotn ...

  3. Java的String.format可以静态导入

    JDK-8203630 ["为String :: format添加等效的实例方法"]假定"将String :: format实现为静态的参数似乎是可以静态导入 forma ...

  4. java 格式化 布尔型_这么久才知道Java中的format很强大!

    Java中允许我们对指定的对象进行某种格式化,从而得到我们想要的格式化样式. Format 首先介绍java.text包中的Format Foramt是一个抽象基类,其具体子类必须实现 format( ...

  5. python format 冒号_python之格式化输出

    字符串格式化有两种方式,%和format 先介绍下%号的方法 #%s的语法结构,叫做占位符,就是先占一个位置,然后我们用真实的要显示的数据替换占位符即可 #最简单的用法就是下面的方式,其实%s还有其他 ...

  6. python中str.format用法_详解Python中的str.format方法

    字符串的内置方法大致有40来个,但是一些常用的其实就那么20几个,而且里面还有类似的用法,区分度高比如:isalpha,isalnum,isdigit,还有一些无时不刻都会用到的split切分,joi ...

  7. 白泽知识讲堂 | printf漏洞介绍

    引子 Hello各位小伙伴们,白泽又和大家见面了.大家还记得自己写的第一个C语言程序吗? 那是我们和代码爱情的起点,一眼万年--没错,就是那个耳熟能详的Hello World ! 1#include ...

  8. java中format有什么用_Java中强大的format

    Java中允许我们对指定的对象进行某种格式化,从而得到我们想要的格式化的结果. Format 首先介绍java.text包中的 Format Foramt是一个抽象基类,其具体子类必须实现 forma ...

  9. java 中 format的不同用法

    Format 首先介绍java.text包中的Format Foramt是一个抽象基类,其具体子类必须实现 format(Object obj, StringBuffer toAppendTo, Fi ...

  10. formatter java_Java笔记 - Java中的格式化输出,Formatter类的介绍

    本文主要内容 1.System.out.format()格式化方法的介绍(): 2.Formatter类的介绍和使用:初始化需要传入用于输出的介质,如System.out: 3.格式化说明符:form ...

最新文章

  1. 3模型大小_分布式训练中数据并行远远不够,「模型并行+数据并行」才是王道...
  2. oracle存储过程参考资料(网上转载)
  3. Storm/JStorm之Topology提交过程
  4. Xposed源码剖析——app_process作用详解
  5. java垃圾回收之循环引用
  6. spark submit参数及调优
  7. sqlmap的简单用法
  8. Rust FFI 编程--理解不同语言的数据类型转换
  9. 【面向代码】学习 Deep Learning(四) Stacked Auto-Encoders(SAE)
  10. 一种一致性HASH算法的实现方法,附核心代码
  11. 写博客时怎么录制动态图片或者小视频
  12. JAVA最强工具类之一HuTool
  13. 我对“心即理,致良知,知行合一”和《王阳明四句教》的的理解。
  14. 自动注册gmail邮箱构想
  15. 微信小游戏保存图片到本地
  16. 如何使用RedisTemplate访问Redis数据结构
  17. 关于神经网络的轻量化
  18. 没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)
  19. python实现——doc与docx互转(终极版)
  20. 栈的实现(C语言版)

热门文章

  1. 数学智力题 武士数独题目_数学智力题九宫格
  2. html鼠标悬停边框颜色,鼠标悬浮在输入框改变边框颜色或背景色代码
  3. 三成手机电子书暗藏陷阱 诱骗下载强行吸费
  4. 如何使用Arduino开发板和ADXL345加速度计跟踪方向
  5. 故障:在 Application Log 中出现 ID57860 的 Backup Exec 错误日志
  6. 计算机怎么剪切音乐然后合在一起,电脑怎么剪辑合并音乐
  7. 远程桌面服务器连接失败,Windows服务器远程桌面连接失败是什么原因
  8. 重读模电教材一_童诗白、华成英
  9. 啦啦外卖独立版41.7全开源小程序app全套源码带vue源码
  10. 未来教育计算机二级python_计算机二级题库