JDK1.5中,String类新增了一个很有用的静态方法String.format,这个方法可以简化字符串的输出工作,避免在System.out.println方法和记录Log时代码中出现大量的字符串连接符“+”这种丑陋的代码书写方式,使用指定的格式字符串和参数返回一个格式化字符串,而在System.out.printf方法中也使用了format这种方式输出至console中。
java中的String.format函数有些类似c语言中printf函数,一些格式字符串与C类似,方法中提供了对布局对齐和排列的支持,以及对数值、字符串和日期/时间数据的常规格式和特定于语言环境的输出的支持。
1. 整数类型
%[index$][标识][最小宽度]转换方式
注:其中[]中表示非必需可选项
index表示参数在参数列表(可变参数args)中的位置,位置从1开始,以此类推;
几种常用的标识如下:
标识符 |
含义 |
‘-‘ |
最小宽度内左对齐,不可以与’0’一起使用 |
‘#’ |
只能用在8进制和16进制,8进制在结果前加一个0,16进制前面加0x |
‘+’ |
结果总是包含一个符号,一般用于10进制 |
‘ ‘(空格) |
正值前加空格,负值前加-,一般用于10进制 |
‘0’ |
结果用左边0填充 |
‘,’ |
每3位用,分隔,用于10进制 |
‘(‘ |
参数为负数时,结果中不添加负号,使用()把数字括起来 |
最小宽度表示向输出中写入的最少字符数,如果实际字符数超过该字符数,继续显示;
转换方式:d-十进制,o-八进制,x或X-十六进制。
实例代码如下:
System.out.println(String.format("%1$010d", -19999)); //expect "-000019999" System.out.println(String.format("%1$,010d", -19999)); //expect "-00019,999" System.out.println(String.format("%1$ 10d", -19999)); //expect " -19999" System.out.println(String.format("%1$,(10d", -19999)); //expect " (19,999)" System.out.println(String.format("%1$#15x", -19999)); //expect " 0xffffb1e1"
2. 浮点数类型
%[index$][标识][最小宽度][.精度]转换方式
index不再赘述;
标识与整数类型大体类似,只是使用场景(转换方式)稍微有所不同:
标识符 |
含义 |
‘-‘ |
在最小宽度内左对齐,不可以与’0’同时使用 |
‘+’ |
结果总是包括一个符号 |
‘ ’(空格) |
正值前加空格,负值前加负号 |
‘0’ |
结果用左边0填充 |
‘,’ |
每3位数字之间用“,”分隔(只用于fgG的转换) |
‘(’ |
若参数是负数,则结果中不添加负号而是用圆括号把数字括起来(只适用于eEfgG的转换) |
精度用于控制小数点后面的位数,如果不设置,ms是6位;
转换方式:
'e', 'E' |
结果被格式化为用计算机科学记数法表示的十进制数 |
'f' |
结果被格式化为十进制普通表示方式 |
'g', 'G' |
根据具体情况,自动选择用普通表示方式还是科学计数法方式(暂不知道其如何选择) |
'a', 'A' |
结果被格式化为带有效位数和指数的十六进制浮点数(这个就更没看懂了) |
实例代码如下:
System.out.println(String.format("%1$(15e", -19999.0)); //expect " (1.999900e+04)" System.out.println(String.format("%1$(15f", -19999.0)); //expect " (19999.000000)" System.out.println(String.format("%1$015f", -19999.0)); //expect "-0019999.000000" System.out.println(String.format("%1$0+15.4f", 19999.01)); //expect "+000019999.0100" System.out.println(String.format("%1$0+15.4g", 19999.01)); //expect "+000002.000e+04" System.out.println(String.format("%1$0+15.4a", 19999.01)); //expect "+0x00001.387cp14"
3. 日期类型
日期和时间转换的后缀字符是为 't' 和 'T',在format中使用日期类型进行转换,可以避免沿用原有的SimpleDateFormat进行转换(比较繁琐),优雅地解决将Date类型输出成对应的字符串表示。
参数 |
含义 |
'B' |
特定于语言环境的月份全称,例如 "January" 和 "February" |
'b'/'h' |
特定于语言环境的月份简称,例如 "Jan" 和 "Feb" |
'A' |
特定于语言环境的星期几全称,例如 "Sunday" 和 "Monday" |
'a' |
特定于语言环境的星期几简称,例如 "Sun" 和 "Mon" |
'C' |
除以100的四位数表示的年份,被格式化为必要时带前导零的两位数,即00 - 99 |
'Y' |
年份,被格式化为必要时带前导零的四位数(至少),例如,0092 等于格里高利历的 92 CE |
'y' |
年份的最后两位数,被格式化为必要时带前导零的两位数,即 00 - 99 |
'j' |
一年中的天数,被格式化为必要时带前导零的三位数,例如,对于格里高利历是 001 - 366 |
'm' |
月份,被格式化为必要时带前导零的两位数,即01 - 13 |
'd' |
一个月中的天数,被格式化为必要时带前导零两位数,即 01 - 31 |
'e' |
一个月中的天数,被格式化为两位数,即 1 - 31 |
'H' |
24小时制的小时,被格式化为必要时带前导零的两位数,即00-23 |
'I' |
12小时制的小时,被格式化为必要时带前导零的两位数,即01-12 |
'k' |
24小时制的小时,即0 - 23 |
'M' |
小时中的分钟,被格式化为必要时带前导零的两位数,即00-59 |
'S' |
分钟中的秒,被格式化为必要时带前导零的两位数,即00-60("60" 是支持闰秒所需的一个特殊值) |
'L' |
秒中的毫秒,被格式化为必要时带前导零的三位数,即000-999 |
'N' |
秒中的毫微秒,被格式化为必要时带前导零的九位数,即000000000 – 999999999 |
'p' |
特定于语言环境的”上午或下午”标记以小写形式表示,例如 "am" 或 "pm"。使用转换前缀'T'可以强行将此输出转换为大写形式 |
'z' |
相对于GMT的RFC 822格式的数字时区偏移量,例如-0800 |
'Z' |
表示时区缩写形式的字符串。Formatter的语言环境将取代参数的语言环境 |
's' |
自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的秒数,即 Long.MIN_VALUE/1000 与 Long.MAX_VALUE/1000 之间的差值 |
'Q' |
自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的毫秒数,即 Long.MIN_VALUE 与 Long.MAX_VALUE 之间的差值 |
Calendar.getInstance().set(2014, 6, 6, 12, 05); Date date = Calendar.getInstance().getTime(); System.out.println(String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", date)); //expect "2014-06-06 11:41:00"
如果每次都是单个年份和月份的组合,format中也是比较大的工作量,因此,系统中提供了格式化日期中比较常用的日期/时间组合:
组合参数 |
含义 |
'R' |
24 小时制的时间,被格式化为"%tH:%tM" |
'T' |
24 小时制的时间,被格式化为 "%tH:%tM:%tS" |
'r' |
12 小时制的时间,被格式化为 "%tI:%tM:%tS %Tp"。上午或下午标记 ('%Tp') 的位置可能与语言环境有关 |
'D' |
日期,被格式化为 "%tm/%td/%ty" |
'F' |
ISO 8601 格式的完整日期,被格式化为 "%tY-%tm-%td" |
'c' |
日期和时间,被格式化为 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969" |
System.out.println(String.format("%tD", date)); //expect "06/06/14" System.out.println(String.format("%tc", date)); //expect "星期五 六月 06 11:44:53 CST 2014" System.out.println(String.format("%tF", date)); //expect "2014-06-06"
其他
- %在format中用于控制转换方式,属于特殊字符,但是如果想要在其中输出%,使用两个%%;
- %n用于取得平台独立的行分隔符,与System.getProperty(“line.separator”)一致;
- 对字符(character)进行格式化比较简单,使用转换符号c即可,也仅提供了一种标识’-‘(左对齐);
- 默认情况下,可以不设置[index$],这样就按照参数出现的顺序进行匹配,此时如果参数的个数比在format字符串出现的少,直接抛异常;比format字符串出现的多,取前面匹配的值,忽略后续没有使用的值。
相关推荐
1. `String.format(Locale l, String format, Object... args)` - 使用指定的语言环境、格式字符串和参数返回一个格式化字符串。 2. `String.format(String format, Object... args)` - 使用指定的格式字符串和...
public static String format(String format, Object... args) ``` - **`format`参数**:这是一个`String`,包含要格式化的复合格式字符串,其中可以包含占位符(`%s`, `%d`, `%f`, `%c`, `%t`, `%n`等)。 - **`...
源于C#中的string.Format() 代码如下: String.prototype.format = function(args) { if (arguments.length>0) { var result = this; if (arguments.length == 1 && typeof (args) == “object”) { for (var key in ...
public static String format(String format, Object... args) ``` 其中`format`参数指定了字符串模板,而`args`参数则提供了模板中占位符的具体值。例如,假设我们想将`strings.xml`中的字符串`my_text`格式化为...
public static String format(String format, Object... args); ``` 这里的`format`参数定义了输出格式,`args`则是一系列待格式化的对象。该函数的设计借鉴了C语言中的`printf`函数,但又有所改进,更加灵活和强大...
11. **格式化输出**:`format(String format, Object... args)`方法可以根据指定的格式和参数创建一个新的字符串。 此外,String类还提供了很多其他实用的方法,如`startsWith(String prefix)`、`endsWith(String ...
String result = MessageFormat.format(pattern, args); ``` `MessageFormat` 适用于需要处理复杂格式化场景,如国际化和本地化。但其性能通常低于 `StringBuilder`,因为它的内部实现更复杂。 为了进行性能对比...
1. **`String.format(String format, Object... args)`** - **功能**:使用本地语言环境和指定的格式字符串及参数列表来生成一个新的格式化字符串。 - **参数**: - `format`:一个包含转换符的格式化字符串。 -...
Debug.LogWarning(string.Format("[WARN] {0} - {1}", DateTime.Now, string.Format(message, args))); } public static void Error(string message, params object[] args) { Debug.LogError(string.Format(...
String message = MessageFormat.format(pattern, args); ``` 在这个例子中,`{0}`是一个位置参数,它会被`args`数组中的第一个元素(在这里是`date`)替换。 通过学习这些字符串格式化技术,你可以更有效地在Java...
它的基本语法是 `String.format(String format, Object... args)`,其中 `format` 是格式化字符串,`args` 是要被格式化的参数。 在 String format 中,我们可以使用不同的格式化符号来格式化输出。例如: * `%s`:...
1. `format(String format, Object... args)`:此方法使用给定的字符串格式和参数来生成一个新的格式化字符串。新字符串总是基于本地语言环境。例如,日期的显示会根据当前系统设置的地区而有所不同。 2. `format...
- 格式化字符串,Net 提供了 `string.Format(format, args)`,Java 则有 `String.format(format, args)`。 - 对于查找字符,两者都有 `indexOf` 和 `lastIndexOf` 方法,但 Net 提供了 `startIndex` 参数,如 `x....
args)`则类似于`String.format()`,支持格式化的字符串构建。 10. **编码与解码**:`StringUtils.newStringUtf8(byte[] bytes)`和`StringUtils.getBytesUtf8(String str)`分别用于从字节数组创建UTF-8编码的字符串...
if (string.IsNullOrEmpty(format) || args == null || args.Length == 0) throw new ArgumentException("无效的参数"); // 替换占位符 for (int i = 0; i < args.Length; i++) { string placeholder = "{" +...
1. `Console.WriteLine(string format, params object[] args)`:在控制台打印格式化的字符串。 2. `Console.ReadLine()`:从控制台读取一行输入。 八、类型转换 1. `(Type)expression`:强制类型转换。 2. `...
类似于`printf`或`format`函数,`StringUtil.format(String format, Object... args)`方法可以用于构建动态字符串。它可以接受一个格式字符串和任意数量的参数,将参数按照格式字符串中的占位符替换进去。 5. **...
- `format(String format, Object... args)`:按照指定的格式字符串格式化对象。 - `formatted(String format, Object... args)`:与`format()`类似,但返回新的`String`对象。 7. **其他实用方法**: - `starts...