本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
javaweb开发中我们经常需要对结果进行格式化整理。有的时候我们需要按照一定的格式返回数据给前台才能达到我们预定的效果。java string类中给我们提供的格式化(format)的方法。
格式化标准
// %[argument_index$][flags][width][.precision][t]conversion
private static final String formatSpecifier
= "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
- 查看jdk源码我们可以看到,源码是通过正则表达式捕获我们的格式化语句。我们格式化语句(下文称为占位符)完整格式即为这个正则表达式所匹配的。换句话说就是上面注释部分的格式
- 完整占位符:
%[argument_index$][flags][width][.precision][t]conversion
-
通过formatSpecifier我们可以看出占位符可以不按照标准占位符来。最简便的一种占位符
%([a-zA-Z])
,所以针对不同数据类型的格式化,占位符的格式将有所裁剪。其中.precision这个占位符是针对浮点数转换类型而言的。其他转换类型不能使用该占位符。否则会报java.util.IllegalFormatPrecisionException
错(非法精度)。-
% , 占位符开始的符号(同时也是占位符中的转义字符)。
-
[argument_index$] ,位置索引从1开始计算,用于指定对索引相应的实参进行格式化并替换掉该占位符。
-
[flags] ,用于增强格式化能力,可同时使用多个 [flags] ,但某些标识是不能同时使用的。
-
[width] ,用于设置格式化后的字符串最小长度,若使用 [最小宽度] 而无设置 [标识] ,那么当字符串长度小于最小宽度时,则以左边补空格的方式凑够最小宽度。
-
[•precision] ,对于浮点数类型格式化使用,设置保留小数点后多少位。
-
[t] , 时间格式
-
conversion ,用于指定格式化的样式,和限制对应入参的数据类型。
-
格式化整数
%[argument_index$][flags][width]conversion
-
这里的占位符和上述的标准占位符一样。唯一需要解释的就是flags(可用标识)和conversion(转换类型)。
-
flags:
- - :在最小宽度内左对齐,不可以与0标识一起使用。
- 0 :若内容长度不足最小宽度,则在左边用0来填充。
- # :对8进制和16进制,8进制前添加一个0,16进制前添加0x。
- + :结果总包含一个+或-号。
- 空格 :正数前加空格,负数前加-号。
- , :只用与十进制,每3位数字间用,分隔。
- ( :若结果为负数,则用括号括住,且不显示符号。
-
conversion:
- d :十进制
- o :八进制
- x或X :十六进制
- n :平台独立的换行符, 也可通过System.getProperty("line.separator")获取。
String.format("%n","234")
,实际就是一个换行符 - b :布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。
-
examples: 其中 十进制、八进制、十六进制都是整数可以互相使用,只有#适合八进制或者十六进制
System.out.println("实现左对齐:"); System.out.println(String.format("%1$-9d", 1245)); System.out.println("实现用0填充:"); System.out.println(String.format("%1$09d", 1245)); System.out.println("实现用+/-填充:"); System.out.println(String.format("%1$+9d", 1245)); System.out.println("实现用空格填充:"); System.out.println(String.format("%1$ 9d", 1245)); System.out.println(String.format("%1$ 9d", -1245)); System.out.println("实现用,填充:"); System.out.println(String.format("%1$,9d", 1245)); System.out.println("实现用(填充:"); System.out.println(String.format("%1$(9d", -1245)); System.out.println("实现结合使用:"); System.out.println(String.format("%1$0(9d", -1245));
格式化浮点数
%[argument_index$][flags][width][.precision]conversion
- 这里的占位符和上述的标准占位符一样。唯一需要解释的就是flags(可用标识)和conversion(转换类型)。
- flags:
- - :在最小宽度内左对齐,不可以与0标识一起使用。
- 0 :若内容长度不足最小宽度,则在左边用0来填充。
- + :结果总包含一个+或-号。
- 空格 :正数前加空格,负数前加-号。
- , :只用与十进制,每3位数字间用,分隔。
- ( :若结果为负数,则用括号括住,且不显示符号。
- conversion:
- e或E :结果被格式化为用计算机科学记数法表示的十进制数
- f :结果被格式化为十进制普通表示方式
- g或G :根据具体情况,自动选择用普通表示方式还是科学计数法方式,
- a或A :结果被格式化为带有效位数和指数的十六进制浮点数
- notes:
- 在浮点数中,如果精度(precision)没有指定的情况下,默认精度(precision)为6
- conversion=e,保留小数点后
precision
位 - conversion=f,保留小数点后
precision
位 - conversion=g,保留
precision
位有效数字 - conversion=a,保留小数点后
precision
位
- examples:
System.out.println(String.format("%20.9a", 1223d));
System.out.println(String.format("%20.9e", 1223d));
System.out.println(String.format("%20.9f", 1223d));
System.out.println(String.format("%20.9g", 12123d));
格式化字符
%[argument_index$][flags][width]conversion
- flags:
- - :在最小宽度内左对齐,不可以与0标识一起使用。
- conversion
- s :字符串
- c :字符类型,实参必须为char或int、short等可转换为char类型的数据类型,否则抛IllegalFormatConversionException异常。
格式化日期
%[argument_index$][flags][width]conversion
- flags:
- - :在最小宽度内左对齐,不可以与0标识一起使用。
- conversion: 以下转换字符用来格式化时间: 'H' 24 小时制的小时,被格式化为必要时带前导零的两位数,即 00 - 23。 'I' 12 小时制的小时,被格式化为必要时带前导零的两位数,即 01 - 12。 'k' 24 小时制的小时,即 0 - 23。 'l' 12 小时制的小时,即 1 - 12。 '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 之间的差值。
<font color="red">以下转换字符用来格式化日期</font>:
'B' 特定于语言环境的月份全称,例如 "January" 和 "February"。
'b' 特定于语言环境的月份简称,例如 "Jan" 和 "Feb"。
'h' 与 'b' 相同。
'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。
<font color="red">式化常见的日期/时间组合。</font>:
'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"。
格式化百分数
%[argument_index$][flags][width]conversion
- 这里百分数其实就是我们一个固定格式,这里需要注意的是%是占位符的开始符号,所以我们用%需要用%%来表达原来的意思
System.out.println(String.format("%1$02d%%", 30));
这个就是输出30%。