String.format - 日理万妓 2022-06-05 02:11 257阅读 0赞 ![cup-of-coffee-laptop-office-macbook-89786.jpeg][] Java 中,使用 `+` 进行字符串的硬拼接是非常 low 的,更优雅的做法是使用 `String.format`。 ### 介绍 ### Java 中 String 类的 `format()` 方法就用于创建格式化的字符串以及连接多个字符串对象: **String.format(String format, Object … args)** ### format 详细 ### 查看 JDK 文档得知,`String.format()` 方法的第一个参数是有个完整公式: **`%[argument_index$][flags][width][.precision]conversion`** 翻译过来就是: **`%[index$][标识][最小宽度][.精度]转换符`** 这里我们只要牢记这个公式就可以,下面说下每部分所代表的含义 * `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` 中去。 下面,我们依次举例说明各个参数的意义: 1. **\[argument\_index$\]** String.format("格式参数$的使用:%1$d,%2$s", 99,"abc"); //格式参数$的使用:99,abc String.format("我叫%2$s,她叫%1$s", "小明","小方"); // 我叫小方,她叫小明 依然是百分号%开头,中间多了个`2$` 、`1$` ,表示后面参数位置的索引. 2. **\[flags\]** 金额添加 `,` 分隔: String.format("%1$,d", 999999999); // 999,999,999 为正负数添加符号: String.format("显示正负数的符号:%+d与%+d", 99, -99) //显示正负数的符号:+99与-99 3. **\[width\]** String.format("%1$08d", 123456); //00123456 这里0就是flag,表示结果将用零来填充,8就是width,表示最少要8位 4. **\[.precision\]** 浮点型数据保留两位小数: String.format("%1$.2f", 12.12555); //12.13 看小数点就知道使用它必须是浮点型数据 5. **conversion** 八进制整数: String.format("%o", 8); //10 浮点型: String.format("%f 元", 50*0.85); //42.500000 元 更多conversion 以及 flags 见下表。 ### flages 与 conversion ### #### flags列表 #### <table> <thead> <tr> <th align="center">标 志</th> <th>说 明</th> <th>示 例</th> <th>结 果</th> </tr> </thead> <tbody> <tr> <td align="center">+</td> <td>为正数或者负数添加符号</td> <td>(“%+d”,15)</td> <td>+15</td> </tr> <tr> <td align="center">−</td> <td>左对齐</td> <td>(“%-5d”,15)</td> <td>15</td> </tr> <tr> <td align="center">0</td> <td>数字前面补0</td> <td>(“%04d”, 99)</td> <td>0099</td> </tr> <tr> <td align="center">空格</td> <td>在整数之前添加指定数量的空格</td> <td>(“% 4d”, 99)</td> <td>99</td> </tr> <tr> <td align="center">,</td> <td>以“,”对数字分组</td> <td>(“%,f”, 9999.99)</td> <td>9,999.990000</td> </tr> <tr> <td align="center">(</td> <td>使用括号包含负数</td> <td>(“%(f”, -99.99)</td> <td>(99.990000)</td> </tr> <tr> <td align="center">#</td> <td>如果是浮点数则包含小数点,如果是16进制或8进制则添加0x或0</td> <td>(“%#x”, 99),(“%#o”, 99)</td> <td>0x63 , 0143</td> </tr> <tr> <td align="center"><</td> <td>格式化前一个转换符所描述的参数</td> <td>(“%f和%<3.2f”, 99.45)</td> <td>99.450000和99.45</td> </tr> </tbody> </table> #### conversion列表 #### <table> <thead> <tr> <th align="center">转 换 符</th> <th>说 明</th> <th align="center">示 例</th> </tr> </thead> <tbody> <tr> <td align="center">%s</td> <td>字符串类型</td> <td align="center">“mingrisoft”</td> </tr> <tr> <td align="center">%c</td> <td>字符类型</td> <td align="center">‘m’</td> </tr> <tr> <td align="center">%b</td> <td>布尔类型</td> <td align="center">true</td> </tr> <tr> <td align="center">%d</td> <td>整数类型(十进制)</td> <td align="center">99</td> </tr> <tr> <td align="center">%x</td> <td>整数类型(十六进制)</td> <td align="center">FF</td> </tr> <tr> <td align="center">%o</td> <td>整数类型(八进制)</td> <td align="center">77</td> </tr> <tr> <td align="center">%f</td> <td>浮点类型</td> <td align="center">99.99</td> </tr> <tr> <td align="center">%a</td> <td>十六进制浮点类型</td> <td align="center">FF.35AE</td> </tr> <tr> <td align="center">%e</td> <td>指数类型</td> <td align="center">9.38e+5</td> </tr> <tr> <td align="center">%g</td> <td>通用浮点类型(f和e类型中较短的)</td> <td align="center"></td> </tr> <tr> <td align="center">%h</td> <td>散列码</td> <td align="center"></td> </tr> <tr> <td align="center">%n</td> <td>换行符</td> <td align="center"></td> </tr> <tr> <td align="center">%tx</td> <td>日期与时间类型(x代表不同的日期与时间转换符)</td> <td align="center"></td> </tr> <tr> <td align="center">%%</td> <td>百分比类型</td> <td align="center">%</td> </tr> </tbody> </table> ### 时间格式化 ### 我们经常需要格式化时间,所需的 `conversion` 是一个由两字符组成的序列。 第一个字符是 `t`或 `T`。 第二个字符表明所使用的格式。 也就是说用 `conversion` 的时候首先必要写一个`t` ,然后在写 `conversion` 。 时间类型有它自己的一套 `conversion` ,我们简单的选择几个来说: * `Y` 年份,被格式化为必要时带前导零的四位数(至少)。 * `m` 月份,被格式化为必要时带前导零的两位数,即 01 - 12。 * `d` 一个月中的天数,被格式化为必要时带前导零两位数,即 01 - 31。 上面三个分别表示年月日 String.format("%1$tY-%1$tm-%1$td", new Date()); //2016-11-13 以上就是 `yyyy-MM-dd` 格式显示当前时间 #### 日期转换符 #### <table> <thead> <tr> <th align="center">转 换 符</th> <th>示例说明</th> </tr> </thead> <tbody> <tr> <td align="center">c</td> <td>全部日期和时间信息:周二 11月 15 14:37:04 GMT+08:00 2016</td> </tr> <tr> <td align="center">F</td> <td>年-月-日格式:2016-11-15</td> </tr> <tr> <td align="center">D</td> <td>月/日/年格式:11/15/16</td> </tr> <tr> <td align="center">r</td> <td>HH:MM:SS PM格式(12时制):02:37:04 下午</td> </tr> <tr> <td align="center">T</td> <td>HH:MM:SS格式(24时制):14:37:04</td> </tr> <tr> <td align="center">R</td> <td>HH:MM格式(24时制):14:37</td> </tr> <tr> <td align="center">b</td> <td>月份简称</td> </tr> <tr> <td align="center">B</td> <td>月份全称</td> </tr> <tr> <td align="center">a</td> <td>星期简称</td> </tr> <tr> <td align="center">A</td> <td>星期全称</td> </tr> <tr> <td align="center">C</td> <td>年前两位(不足两位补零)</td> </tr> <tr> <td align="center">y</td> <td>年后两位(不足两位补零)</td> </tr> <tr> <td align="center">j</td> <td>当年的第几天</td> </tr> <tr> <td align="center">m</td> <td>月份(不足两位补零)</td> </tr> <tr> <td align="center">d</td> <td>日期(不足两位补零)</td> </tr> <tr> <td align="center">e</td> <td>日期(不足两位不补零)</td> </tr> </tbody> </table> #### 时间转换符 #### <table> <thead> <tr> <th align="center">转 换 符</th> <th>示例说明</th> </tr> </thead> <tbody> <tr> <td align="center">H</td> <td>24小时制的小时(不足两位补零)</td> </tr> <tr> <td align="center">k</td> <td>24小时制的小时(不足两位不补零)</td> </tr> <tr> <td align="center">I</td> <td>12小时制的小时(不足两位补零)</td> </tr> <tr> <td align="center">i</td> <td>12小时制的小时(不足两位不补零)</td> </tr> <tr> <td align="center">M</td> <td>分钟(不足两位补零)</td> </tr> <tr> <td align="center">S</td> <td>秒(不足两位补零)</td> </tr> <tr> <td align="center">L</td> <td>毫秒(不足三位补零)</td> </tr> <tr> <td align="center">N</td> <td>毫秒(不足9位补零)</td> </tr> <tr> <td align="center">p</td> <td>小写字母的上午或下午标记,如中文为“下午”,英文为pm</td> </tr> <tr> <td align="center">z</td> <td>相对于GMT的时区偏移量,如+0800</td> </tr> <tr> <td align="center">Z</td> <td>时区缩写,如CST</td> </tr> <tr> <td align="center">s</td> <td>自1970-1-1 00:00:00起经过的秒数</td> </tr> <tr> <td align="center">Q</td> <td>自1970-1-1 00:00:00起经过的豪秒</td> </tr> </tbody> </table> 项目中,一般通过网络请求获取的时间日期是字符串,需要配合java中的`SimpleDateFormat` 类使用,然后转成Date来处理或显示,如下: SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date=sdf.parse("2016-11-13 15:30:22"); 解释一下,yyyy是完整的西元年,MM是月份,dd是日期,HH是24小时制,而hh是12小时制 ,mm是分,ss是秒 还有,如果涉及到日期的计算,建议不要使用 java 的 Date 类,而是使用 [Joda-Time][] ,或者使用 java8 新的时间类来进行计算。 ### 参考 ### [JAVA字符串格式化-String.format()的使用][JAVA_-String.format] [Java魔法堂:String.format详解][Java_String.format] [cup-of-coffee-laptop-office-macbook-89786.jpeg]: http://oslynwh8c.bkt.clouddn.com/image/hexo/cup-of-coffee-laptop-office-macbook-89786.jpeg [Joda-Time]: http://www.joda.org/joda-time/ [JAVA_-String.format]: http://blog.csdn.net/lonely_fireworks/article/details/7962171 [Java_String.format]: http://www.cnblogs.com/fsjohnhuang/p/4094777.html
相关 java stringbuilder stringformat 速度比较 1.一个一个地连接 //验证代码 for (int i = 0; i < 100; i++) \{ long start = System.nanoTime 待我称王封你为后i/ 2022年05月30日 10:38/ 0 赞/ 269 阅读
相关 WPF StringFormat 格式化文本 原文: [WPF StringFormat 格式化文本][WPF StringFormat] StringFormat对特定数据格式的转换 WPF中,对数字/日期等的格 朴灿烈づ我的快乐病毒、/ 2021年09月17日 15:58/ 0 赞/ 443 阅读
还没有评论,来说两句吧...