String.format()方法使用说明

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

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

[java] view plain copy print?

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

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

首先来看一个列子

[java] view plain copy print?

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

这里会打印出什么内容?

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

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

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

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

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

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

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

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

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

先看一个简单的列子:

[java] view plain copy print?

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

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

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

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

我再稍微改下列子:

[java] view plain copy print?

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

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

[java] view plain copy print?

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

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

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

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

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

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

[java] view plain copy print?

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

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

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

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

width:表示最小宽度

先看个列子:

[java] view plain copy print?

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

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

再一个列子:

[java] view plain copy print?

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

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

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

接下来说下[.precision]

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

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

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

[java] view plain copy print?

  1. 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_indexflagswidth 的定义同上。

    所需的 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"

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

    [java] view plain copy print?

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

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

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

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

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

时间: 2024-12-26 17:31:56

String.format()方法使用说明的相关文章

测试String.Format方法

今天想使用String.Format,和平时的用法不一样. 直接上代码: [Test] public void TestMethod6() { string A = "A"; string B = "B"; string C = "C"; string D = "{0}"; String str = String.Format(D, A, B, C); Assert.AreEqual(str, "A");

C#语言基础知识(4):C#中的String.Format方法

定义String.Format是将指定的String类型的数据中的每个格式项替换为相应对象的值的文本等效项.(1)string p1="xiaomeng";string p2="xiaobei";Response.Write(String.Format("Hello {0},I'm {1}",p1,p1));(2)Response.Write(String.Format("Hello {0},I'm {1}","xi

避免string.Format方法的装箱

我们知道,使用string.Format方法可能会存在装箱的情况.比如如下: static void Main(string[] args) { string s = string.Format("拼接{0}和{1}", 1, 2); Console.WriteLine(s); Console.ReadKey(); } string.Format()方法接收的后两个形参类型是object,所以这里存在装箱. 现在查看IL代码: →打开"开发人员命令提示" →导航到应

JAVA String.format 方法使用介绍

1.对整数进行格式化:%[index$][标识][最小宽度]转换方式        我们可以看到,格式化字符串由4部分组成,其中%[index$]的含义我们上面已经讲过,[最小宽度]的含义也很好理解,就是最终该整数转化的字符串最少包含多少位数字.我们来看看剩下2个部分的含义吧: 标识: '-'    在最小宽度内左对齐,不可以与“用0填充”同时使用'#'    只适用于8进制和16进制,8进制时在结果前面增加一个0,16进制时在结果前面增加0x'+'    结果总是包括一个符号(一般情况下只适用

Java中利用MessageFormat对象实现类似C# string.Format方法格式化

我们在写C#代码的时候常常会使用到string.Format("待格式化字符串{0},{1},....",参数1,参数2,...),来格式化字符串,特别是拼接字符的时候,这种方式使得代码更为直观清楚. 最近使用java时候却java的string.Format与c#重点string.Format用法不一样,java中的string.format更类似于C语言的sprintf()方法 例如: String str=null; str=String.format("Hello,%

php示例代码之类似于C#中的String.Format方法

php示例代码之类似于C#中的String.Format方法 原文来自于  http://stackoverflow.com/questions/1241177/c-string-format-equivalent-in-php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?php function format() {       $args = func_get_args();       if (count($args) == 0

C#中的String.Format方法(转)

一.定义String.Format是将指定的 String类型的数据中的每个格式项替换为相应对象的值的文本等效项. 如: (1)string p1 = "Jackie";string p2 = "Aillo";Response.Write(String.Format("Hello {0}, I'm {1}", p1, p2));(2)Response.Write(String.Format("Hello {0}, I'm {1}&quo

.NET String.Format 方法 线程安全问题

碰到这个问题 是在和淘宝做信息交互的时候, 接收别人N年前的代码. 代码逻辑很简单,就是取得信息 数据库查询  响应请求返回结果. 最近淘宝的人反映说 N多账户使用的是一个单号.理论上来说 是应该每次都不一样的. 最坑爹的是还出现了 数据库中没数据 但是响应结果却有数据了的神奇现象! 反编译代码,整理后发现 逻辑很简单. 尼玛 问题找不到怎么办???!! 第二个反映就是 可能出现并发了. 一行一行的排查可能出现的并发的地方. 最后发现  String.Format 很有肯能 . 百度后发现 全都

C#中String.Format()方法的使用

一.定义String.Format是将指定的 String类型的数据中的每个格式项替换为相应对象的值的文本等效项. 如: (1)string p1 = "Jackie";string p2 = "Aillo";Response.Write(String.Format("Hello {0}, I'm {1}", p1, p2));(2)Response.Write(String.Format("Hello {0}, I'm {1}&quo